我正在尝试为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();
}
答案 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测试留给自己的作者。