单元测试传递字符串参数除 null 或空之外的任何字符串值

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)

Nko*_*osi 5

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)