单元测试应该失败
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 测试留给它自己的作者。
我正在尝试为 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 测试留给它自己的作者。