单元测试应该失败

时间:2019-08-04 12:26:34

标签: c# unit-testing moq

我正在尝试为GenerateTokenAsync()编写单元测试

public async Task<string> GenerateTokenAsync()
{
    Verify.IsNotNullOrWhiteSpace(ClientId, nameof(ClientId));
    Verify.IsNotNullOrWhiteSpace(ClientSecret, nameof(ClientSecret));
    Verify.IsNotNullOrWhiteSpace(TenantId, nameof(TenantId));

    var clientCredential = new ClientCredential(ClientId, ClientSecret);
    var context = new AuthenticationContext(Constants.AuthenticationContextUrl + TenantId);
    var authResult = await context.AcquireTokenAsync(Constants.AuthResultUrl, clientCredential);

    return authResult?.AccessToken;
}

,并且有3个必须具有值的属性。

我期望Verify.IsNotNullOrWhiteSpace()抛出异常,但不是。

这是一个静态辅助类,它抛出ArgumentException()

由于所有3个属性均未提供任何值,因此测试应失败。

我试图更改单元测试,但无法正常工作。

[TestMethod]
public async Task GenerateTokenAsync_WhenExecuted_GeneratesToken()
{
    // Arrange
    var mockAzureClient = new Mock<IAzureClient>();
    mockAzureClient.Setup(m => m.GenerateTokenAsync()).ReturnsAsync(Guid.NewGuid().ToString("N"));

    // Act
    var token = await mockAzureClient.Object.GenerateTokenAsync();

    // Assert
    token.Should().NotBeNullOrWhiteSpace();
}

2 个答案:

答案 0 :(得分:1)

这可能是XY problem,因为您似乎在嘲笑被测对象。

在这种情况下,我认为无需使用Mock来测试上述功能。创建一个实例并调用被测成员

[TestMethod]
public async Task GenerateTokenAsync_WhenExecuted_WithoutProperties_ShouldFail() {
    // Arrange
    IAzureClient azureClient = new AzureClient(); //Assuming name here
    ArgumentException actual = null;

    // Act
    try {
        var token = await azureClient.GenerateTokenAsync();
    } catch(ArgumentException ex) {
        actual = ex;
    }

    // Assert
    actual.Should().NotBeNull();
}

答案 1 :(得分:1)

您基本上正在测试一个外部SDK,这不是您应该关注的事情。

SDK可以轻松更改,做事的方法和方式也可以更改,您对此无能为力。一旦任何更改,此代码就有可能无法正常工作。

SDK作者提供的测试很可能涵盖了该代码,那么在这种情况下您究竟能实现什么?我不能称其为单元测试,因为它不是一个。这是一个集成测试,也不是一个非常有用的测试。

我建议您集中精力测试调用SDK的代码。确保您不使用空参数调用SDK,该代码是您自己的并且可以控制它。进行测试,然后将SDK测试留给自己的作者。