小编sup*_*nja的帖子

在单元测试中模拟IHttpContextAccessor

我有一个方法来获取标头值使用 IHttpContextAccessor

public class HeaderConfiguration : IHeaderConfiguration
{
    public HeaderConfiguration()
    {

    }

    public string GetTenantId(IHttpContextAccessor httpContextAccessor)
    {
        return httpContextAccessor.HttpContext.Request.Headers["Tenant-ID"].ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在测试GetBookByBookId方法

假设该方法如下所示:

public class Book
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private IHeaderConfiguration _headerConfiguration;
    private string _tenantID;

    public Book(IHeaderConfiguration headerConfiguration, IHttpContextAccessor httpContextAccessor){
        var headerConfig = new HeaderConfiguration();
        _httpContextAccessor = httpContextAccessor;
        _tenantID = headerConfig.GetTenantId(_httpContextAccessor);
    }

    public Task<List<BookModel>> GetBookByBookId(string id){
        //do something with the _tenantId
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我对GetBookByBookId方法的单元测试

[Fact]
public void test_GetBookByBookId()
{
    //Arrange

    //Mock IHttpContextAccessor
    var …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq asp.net-core asp.net-core-webapi

20
推荐指数
2
解决办法
6732
查看次数

使用页面大小和页码在Cosmos DB中分页

我正在尝试使用PageSize和返回cosmosDB中的项目PageNumber.我知道我们可以设置页面大小MaxItemCount,但是我们如何将页码放在这个函数中?

这是我到目前为止所得到的:

  public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString, int pageSize, int pageNumber)
        {
            var feedOptions = new FeedOptions { MaxItemCount = pageSize, EnableCrossPartitionQuery = true };
            IQueryable<T> filter = _client.CreateDocumentQuery<T>(_collectionUri, queryString, feedOptions);
            IDocumentQuery<T> query = filter.AsDocumentQuery();
            var currentPageNumber = 0;
            var documentNumber = 0;
            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                foreach (T t in await query.ExecuteNextAsync())
                {
                    results.Add(t);
                    documentNumber++;
                }
                currentPageNumber++;
                return results;

            }
            return null;
        }
Run Code Online (Sandbox Code Playgroud)

paging pagination azure asp.net-core azure-cosmosdb

12
推荐指数
2
解决办法
9273
查看次数

ASP.NET Core:[FromQuery]用法和URL格式

我试图在我的网络API中使用[FromQuery],我不知道如何使用它.

这是控制器中的GetAllBooks()方法:

 [HttpGet]
 [Route("api/v1/ShelfID/{shelfID}/BookCollection")]
 public async Task<IActionResult> GetAllBooks(string shelfID, [FromQuery] Book bookinfo)
            {
               //do something
            }
Run Code Online (Sandbox Code Playgroud)

这是Book模型类:

 public class Book
    {
        public string ID{ get; set; }
        public string Name{ get; set; }
        public string Author { get; set; }
        public string PublishDate { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我很困惑这是否是使用[FromQuery]的正确方法.我以为URL是

https://localhost:xxxxx/api/v1/ShelfID/{shelfID}/BookCollection/IActionResult?ID="123"&Name="HarryPotter"

但是断点并没有达到我的控制器方法,所以我想也许URL不正确.有什么建议?谢谢!

c# asp.net-core asp.net-core-webapi

11
推荐指数
1
解决办法
2万
查看次数

如何使用 NSubstitute 模拟 HttpClient

我正在尝试使用NSubstitute来模拟 HttpClient。这是代码:

public static HttpClient GetHttpClient(bool isSucess = true, string methodType = "GET")
        {
            var mockIHttpMessageHandler = Substitute.For<IMockHttpMessageHandler>();
            var mockHttpMessageHandler = Substitute.For<MockHttpMessageHandler>(mockIHttpMessageHandler);
            var httpResponse = Substitute.For<HttpResponseMessage>();
            httpResponse.Content = new StringContent("\"test\"");
            if (isSucess)
                httpResponse.StatusCode = HttpStatusCode.OK;
            else
                httpResponse.StatusCode = HttpStatusCode.NotFound;

            var mockHttpClient = Substitute.For<HttpClient>(mockHttpMessageHandler);
            mockHttpClient.BaseAddress = new Uri("http://localhost");

            if(methodType != "POST"){
                mockHttpClient.GetAsync(Arg.Any<Uri>()).ReturnsForAnyArgs(httpResponse);
            }
            return mockHttpClient;
        }
Run Code Online (Sandbox Code Playgroud)

但是,我在这一行遇到错误:

mockHttpClient.GetAsync(Arg.Any<Uri>()).ReturnsForAnyArgs(httpResponse);
Run Code Online (Sandbox Code Playgroud)

错误是

NSubstitute.Exceptions.RedundantArgumentMatcherException:'上次调用后留下了一些参数规范(例如 Arg.Is、Arg.Any)。

这通常是由于使用参数规范来调用 NSubstitute 无法处理的成员(例如非虚拟成员或对非替代实例的调用),或者出于指定调用以外的目的(例如使用 arg 规范作为返回值)。例如:

var sub = Substitute.For<SomeClass>();
var realType = new MyRealType(sub);
// INCORRECT, arg spec …
Run Code Online (Sandbox Code Playgroud)

c# virtual unit-testing httpclient nsubstitute

8
推荐指数
1
解决办法
9477
查看次数

在使用 SQL 查询的单元测试中模拟 IDocumentQuery

我正在使用单元测试来测试DocumentDBRepository课程。我按照这篇文章作为 SQL 查询用例的示例。但它显示错误

消息:System.InvalidCastException:无法将类型“System.Linq.EnumerableQuery”的对象转换为类型“Microsoft.Azure.Documents.Linq.IDocumentQuery”

这是我的DocumentDBRepository课程代码

private IDocumentQuery<T> GetQueryBySQL(string queryStr)
{
    var uri = UriFactory.CreateDocumentCollectionUri(_databaseId, _collectionId);
    var feedOptions = new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true };
    IQueryable<T> filter = _client.CreateDocumentQuery<T>(uri, queryStr, feedOptions); 
    IDocumentQuery<T> query = filter.AsDocumentQuery();
    return query;

}

public async Task<IEnumerable<T>> RunQueryAsync(string queryString)
{
    IDocumentQuery<T> query = GetQueryBySQL(queryString);

    List<T> results = new List<T>();

    while (query.HasMoreResults)
    {
        results.AddRange(await query.ExecuteNextAsync<T>());
    }
    return results;
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试类的代码

public async virtual Task Test_GetEntitiesAsyncBySQL()
{
    var id …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq azure azure-cosmosdb

7
推荐指数
1
解决办法
2567
查看次数

在使用Linq查询的单元测试中模拟IDocumentQuery

我正在编写单元测试DocumentDBRepository但是我得到了一个空引用异常.我使用Moq框架和XUnit.

这是我DocumentDBRepository课堂上的方法.

public class DocumentDBRepository<T> : IRepository<T> where T: class
{
    private static string DatabaseId;
    private static string CollectionId;
    private static IDocumentClient client;
    public DocumentDBRepository(IDocumentClient documentClient, string databaseId, string collectionId)
    {
        DatabaseId = databaseId;
        CollectionId = collectionId;
        client = documentClient;
        CreateDatabaseIfNotExistsAsync().Wait();
        CreateCollectionIfNotExistsAsync().Wait();
    }

    public async Task<IDocumentQuery<T>> GetQuery(Expression<Func<T, bool>> predicate)
    {
        try
        {
            IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
          UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),
          new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
          .Where(predicate)
          .AsDocumentQuery();

            return query;
        }
        catch (Exception e) …
Run Code Online (Sandbox Code Playgroud)

unit-testing moq azure asp.net-core azure-cosmosdb

6
推荐指数
1
解决办法
1168
查看次数

AuthenticationBuilder不包含AddAzureAd的定义

我在这里遵循了一个教程,尝试使用Azure Ad启用OpenId Connect,这是我尝试添加到Startup.cs文件中的代码。

    services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddAzureAd(options => Configuration.Bind("AzureAd", options))
        .AddCookie();
Run Code Online (Sandbox Code Playgroud)

但是它带有红色下划线,AddAzureAd并显示以下错误消息:

'AuthenticationBuilder'不包含'AddAzureAd'的定义,找不到可以接受的扩展方法'AddAzureAd'接受类型为'AuthenticationBuilder'的第一个参数(您是否缺少using指令或程序集引用?)

我尝试过的步骤:

  1. 清理并重建解决方案
  2. 重新启动Visual Studio

但这并不能解决问题。有人知道导致此问题的另一个原因是什么吗?

c# authentication azure azure-active-directory asp.net-core

5
推荐指数
2
解决办法
2191
查看次数

XUnit 测试 Web API 断言状态代码

我是XUnitWeb API 应用程序测试的新手。我试图用状态代码 404 断言我的响应值,但我不知道该怎么做。

这是我的测试代码。

假设输入为空,测试预计返回 NotFound 或 404 状态代码。

  [Fact]
        public async Task getBooksById_NullInput_Notfound()
        {

            //Arrange
            var mockConfig = new Mock<IConfiguration>();
            var controller = new BookController(mockConfig.Object);

            //Act
            var response = await controller.GetBooksById(null);

            //Assert
            mockConfig.VerifyAll();

            Assert(response.StatusCode, HttpStatusCode.NotFound()); //How to achieve this?

        }
Run Code Online (Sandbox Code Playgroud)

在此测试方法的最后一行中,我无法进行response.StatusCode编译,因为响应变量没有StatusCode属性。而且没有HttpStatusCode我可以调用的类...

这是我GetBooksByID()在控制器类中的方法。

 public class BookController : Controller
    {
        private RepositoryFactory _repositoryFactory = new RepositoryFactory();

        private IConfiguration _configuration;

        public BookController(IConfiguration configuration)
        {
            _configuration = configuration;
        }



        [HttpGet]
        [Route("api/v1/Books/{id}")] …
Run Code Online (Sandbox Code Playgroud)

c# api unit-testing xunit asp.net-core

4
推荐指数
1
解决办法
2万
查看次数

在Xunit()中测试异常

我试图在这个方法上编写Xunit测试:

public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString)
{
    try
    {
        //do something
    }
    catch (DocumentClientException e)
    {
        throw new InvalidOperationException(e);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是单元测试:

[Fact]
public async virtual Task Test_Exception()
{
    var queryString = "SELECT * FROM c";
    var exception = Record.ExceptionAsync(async () => await classname.RunSQLQueryAsync(queryString));
    Assert.NotNull(exception);
    Assert.IsType<DocumentClientException>(exception);
}
Run Code Online (Sandbox Code Playgroud)

但该方法失败了,它说:

消息:Assert.IsType()预期失败:System.DocumentClientException实际:
System.Threading.Tasks.Task`1 [[System.Exception,System.Private.CoreLib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = xxx] ]

当我调试测试时,它不会进入catch块.所以我的问题是如何使单元测试期望方法RunSQLQueryAsyncDocumentClientException

c# unit-testing exception xunit azure-cosmosdb

4
推荐指数
1
解决办法
2543
查看次数

使用linq将值分配给新列表

假设我有一个名为Company的班级

public class Company 
{
   public string name;
   public string id;
}
Run Code Online (Sandbox Code Playgroud)

我有一个名为CompanyList的列表

var companyList = new List<Company>();
Run Code Online (Sandbox Code Playgroud)

我想给这个空companyList变量分配名称=“ Company A”,id =“ 001” 。

我该怎么做?

 companyList.FirstOrDefault().Name = "Company A";
 companyList.FirstOrDefault().Id = "001";
Run Code Online (Sandbox Code Playgroud)

c# linq

4
推荐指数
2
解决办法
87
查看次数