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

问题描述 投票:1回答:2

我是单元测试控制器逻辑。我有一个控制器操作,它需要像这样的字符串参数:

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);
    }
c# .net-core xunit.net
2个回答
2
投票

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);

2
投票

您要测试什么?如果测试未检查防护,则传递期望的字符串值

[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);
© www.soinside.com 2019 - 2024. All rights reserved.