单元测试传递字符串参数除 null 或空之外的任何字符串值
Unit test pass string argument any string value except null or empty
我正在对控制器逻辑进行单元测试。我有一个控制器操作,它采用如下字符串参数:
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>()
意味着测试字符串确实可以为空。
我的问题是:我可以在我的单元测试中传递对应于 "any string value except null or empty" 的参数吗?
编辑
请找到完整的单元测试...
[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>()
仅用于 作为模拟设置的一部分。
mock.Setup(_ => _.SomeMember(It.IsAny<string>()).Returns(SomeValue);
它不能在 Setup
表达式之外使用,并且 return 将成为提供的通用参数的默认值。
即
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);
我正在对控制器逻辑进行单元测试。我有一个控制器操作,它采用如下字符串参数:
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>()
意味着测试字符串确实可以为空。
我的问题是:我可以在我的单元测试中传递对应于 "any string value except null or empty" 的参数吗?
编辑
请找到完整的单元测试...
[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>()
仅用于 作为模拟设置的一部分。
mock.Setup(_ => _.SomeMember(It.IsAny<string>()).Returns(SomeValue);
它不能在 Setup
表达式之外使用,并且 return 将成为提供的通用参数的默认值。
即
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);