Iva*_*nko 7 c# integration-testing unit-testing asp.net-core
我使用 .Net Core 2.0 创建 Web Api。我正在使用 Active Directory Graph API ( https://learn.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet ) 来执行创建新用户。我用这样的接口创建了IADGraphService
interface IADGraphService
{
bool CreateUser(UserModel model);
IList<UserModel> GetUsers();
bool UpdateUser(UserModel model);
bool DeleteUser(string userObjectId);
}
Run Code Online (Sandbox Code Playgroud)
我正在考虑创建集成测试,例如:
// arrange
var service = new ADGraphService();
// act
bool result = service.CreateUser(new UserModel(){ Email = "test@example.com", ..... });
var users = service.GetUsers();
// assert
result.Should().Be(true);
users.Should().Contain(user => user.Email == "test@example.com");
Run Code Online (Sandbox Code Playgroud)
或者也许是这样的接口的单元测试实现:
// arrange
......
var fakeHttpClient = new Mock<IHttpClient>();
fakeHttpClient.Setup(x => x.PostAsync(url, userModelContent)).Returns(mockJsonResult);
var service = new ADGraphService(fakeHttpClient.Object);
// act
var result = service.CreateUser(new UserModel { Email = "test@example.com", .......});
// assert
result.Should().Be(true);
Run Code Online (Sandbox Code Playgroud)
对于这种情况应该使用哪一个?
Joe*_*ite 12
一个好的策略是永远不要模拟不属于您的代码。您应该有一层集成测试来实际调用 Azure AD 并证明它正在执行您想要的操作。
详细说明该策略:
在我看来,您的集成测试完全走在正确的轨道上。您正在编写自己的界面,并且仅公开您的代码需要的行为。您的集成测试证明这些方法确实符合您的预期 - 如果 Microsoft 做出重大更改,您的测试会告诉您。
然后,当您测试更高级别的代码(使用 IADGraphService 的代码)时,您可以模拟 IADGraphService,因为它是您拥有的代码,您可以安全地模拟它。
如果您需要测试 ADGraphService 类的行为,您应该使用带有模拟 HttpClient 的单元测试。为了测试与 Web 服务的集成,您应该在 HttpClient 上而不是在 ADGraphService 类上编写集成测试。
归档时间: |
|
查看次数: |
4344 次 |
最近记录: |