我是单元测试控制器逻辑。我有一个控制器操作,它需要像这样的字符串参数:
public async Task<IActionResult> Get(string searchCriterion)
{
if (string.IsNullOrEmpty(searchCriterion))
{
// Log modelstate errors
return BadRequest("Hello");
}
// etc...
}
请注意检查string.IsNullOrEmpty(searchCriterion)
的门卫。
在单元测试中,我喜欢使用It.IsAny<string>()
:
// Act
var result = await controller.GetSearchNetworkAsync(It.IsAny<string>());
后卫意味着我不能使用它,因为It.IsAny<string>()
意味着测试字符串的确可以为空或为空。
我的问题是:我可以在单元测试中传递与“空或空以外的任何字符串值”相对应的参数吗?
编辑
请找到完整的单元测试...
[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);
}
It.IsAny<string>()
旨在作为only用作模拟程序设置的一部分。
mock.Setup(_ => _.SomeMember(It.IsAny<string>()).Returns(SomeValue);
不打算在Setup
表达式之外使用,它将返回所提供的通用参数的默认值。
即
It.IsAny<string>() == null
使用actual字符串将所需的值传递给被测对象。
//Arrange
//...
string searchCriterion = "Any String You Want Here";
// Act
var result = await controller.GetSearchNetworkAsync(searchCriterion);
您要测试什么?如果测试未检查防护,则传递期望的字符串值
[Fact]
public async Task GetSearchNetworkAsync_WithValidString_ReturnsOkWithNetworkListViewModelCollection_Rn()
{
...
// Act
var result = await controller.GetSearchNetworkAsync("some value");
然后您将需要进行其他测试来检查后卫
[Fact]
public async Task GetSearchNetworkAsync_WithNullString_ReturnsBadRequest()
{
...
// Act
var result = await controller.GetSearchNetworkAsync(null);
或
[Fact]
public async Task GetSearchNetworkAsync_WithEmptyString_ReturnsBadRequest()
{
...
// Act
var result = await controller.GetSearchNetworkAsync(string.empty);