单元测试应该失败

Unit test should be failing

我正在尝试为 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() 抛出异常,但事实并非如此。

这是一个静态助手 class,它会抛出一个 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();
}

这可能是一个 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();
}

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

SDK 可以很容易地改变,做事的方法和方式也可以改变,而你无法控制它。一旦发生任何变化,此代码可能就无法正常工作。

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

我建议您重点测试调用 SDK 的代码。确保您没有使用空参数调用 SDK,该代码是您的,您可以控制它。对其进行测试并将 SDK 测试留给它自己的作者。