Min*_*nto 2 c# xunit.net .net-core
我正在对控制器逻辑进行单元测试。我有一个控制器操作,它接受一个字符串参数,如下所示:
public async Task<IActionResult> Get(string searchCriterion)
{
if (string.IsNullOrEmpty(searchCriterion))
{
// Log modelstate errors
return BadRequest("Hello");
}
// etc...
}
Run Code Online (Sandbox Code Playgroud)
请注意检查的警卫string.IsNullOrEmpty(searchCriterion)。
在我的单元测试中我喜欢使用It.IsAny<string>():
// Act
var result = await controller.GetSearchNetworkAsync(It.IsAny<string>());
Run Code Online (Sandbox Code Playgroud)
守卫意味着我不能使用它,因为It.IsAny<string>()意味着测试字符串确实可以为 null 或为空。
我的问题是:我可以在单元测试中传递与“除 null 或空之外的任何字符串值”相对应的参数吗?
编辑
请找到完整的单元测试...
[Fact]
public async Task GetSearchNetworkAsync_ReturnsOkWithNetworkListViewModelCollection_Rn()
{
// Arrange
var mockRepo = new Mock<IUserRepository>();
mockRepo.Setup(repo => repo.GetUserAndNetworkAsync(It.IsAny<string>()))
.ReturnsAsync(GetOwnUserProfile());
mockRepo.Setup(repo => repo.SearchBirdersToFollowAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>(), It.IsAny<IEnumerable<string>>()))
.ReturnsAsync(GetListOfApplicationUsers(3));
var mockUnitOfWork = new Mock<IUnitOfWork>();
var controller = new UserController(_mapper, mockUnitOfWork.Object, _logger.Object, mockRepo.Object);
controller.ControllerContext = new ControllerContext()
{
HttpContext = new DefaultHttpContext() { User = GetTestClaimsPrincipal() }
};
// Act
//var result = await controller.GetSearchNetworkAsync(It.IsAny<string>());
var result = await controller.GetSearchNetworkAsync(It.Is<string>(str => !string.IsNullOrEmpty(str)));
// Assert
var objectResult = result as ObjectResult;
Assert.NotNull(objectResult);
Assert.IsType<OkObjectResult>(result);
Assert.True(objectResult is OkObjectResult);
Assert.Equal(StatusCodes.Status200OK, objectResult.StatusCode);
Assert.IsType<List<NetworkUserViewModel>>(objectResult.Value);
var model = objectResult.Value as List<NetworkUserViewModel>;
Assert.Equal(3, model.Count);
}
Run Code Online (Sandbox Code Playgroud)
It.IsAny<string>()仅用作模拟设置的一部分。
mock.Setup(_ => _.SomeMember(It.IsAny<string>()).Returns(SomeValue);
Run Code Online (Sandbox Code Playgroud)
它不应该在表达式之外使用Setup,并且将返回所提供的通用参数的默认值。
IE
It.IsAny<string>() == null
Run Code Online (Sandbox Code Playgroud)
使用实际的字符串将所需的值传递给被测对象。
//Arrange
//...
string searchCriterion = "Any String You Want Here";
// Act
var result = await controller.GetSearchNetworkAsync(searchCriterion);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5601 次 |
| 最近记录: |