我有一个方法来获取标头值使用 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) 我正在尝试使用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) 我试图在我的网络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不正确.有什么建议?谢谢!
我正在尝试使用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 规范作为返回值)。例如:
Run Code Online (Sandbox Code Playgroud)var sub = Substitute.For<SomeClass>(); var realType = new MyRealType(sub); // INCORRECT, arg spec …
我正在使用单元测试来测试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) 我正在编写单元测试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) 我在这里遵循了一个教程,尝试使用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指令或程序集引用?)
我尝试过的步骤:
但这并不能解决问题。有人知道导致此问题的另一个原因是什么吗?
我是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) 我试图在这个方法上编写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块.所以我的问题是如何使单元测试期望方法RunSQLQueryAsync有DocumentClientException?
假设我有一个名为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# ×8
asp.net-core ×6
unit-testing ×6
azure ×4
moq ×3
xunit ×2
api ×1
exception ×1
httpclient ×1
linq ×1
nsubstitute ×1
pagination ×1
paging ×1
virtual ×1