我有以下场景,我想知道测试我的服务的正确方法是什么。我有 2 个服务和 2 个存储库。
public class ServiceB : IServiceB
{
public ServiceA(IRepoB)
{
}
public async Task AuditInsert(param, param)
{
IRepoB.Insert(param, param)
}
}
public class ServiceA : IServiceA
{
public ServiceA(IRepoA, IServiceB)
{
}
public async bool DoSomething(param)
{
//logic here
IRepoA.Merge(param)
IServiceB.AuditInsert(param, param)
}
}
////// Testing part
public class ServiceATests
{
private readonly ServiceA _sut;
private readonly Mock<IRepoA> _repoA = new(MockBehavior.Strict)
private readonly Mock<ServiceB> _serviceB = new(MockBehavior.Strict)
_repoA.Setup(x => x.Merge(It.IsAny<ParamEntity>)).Return(Task.TaskCompleted)
_serviceB.Setup(x => x.AuditInsert(It.IsAny<ParamEntity>, It.IsAny<ParamEntity>)).Return(Task.TaskCompleted)
_sut = new ServiceA(_repoA.Object, _serviceB.Object)
}
[Fact]
public async Task TestSomething()
{
//arrange
var testParam = {} // an object
//act
await _sut.DoSomething(testParam)
//assert
_repoA.Verify(x => x.Merge(), Times.Once)
_serviceB.Verify(x => x.AuditInsert(It.IsAny<ParamEntity>, It.IsAny<ParamEntity>), Times.Once)
}
我在该行为中遇到的错误是“调用失败,模拟行为严格,模拟上的所有调用都必须有相应的设置”。
ServiceA 中 IServiceB.AuditInsert(param, param) 行的代码失败。
可能是因为当我设置ServiceB时,我应该以某种方式传递RepoB的模拟?但我不知道该怎么做。 或者如果我删除 _serviceB.Verify 部分并创建一个新类来仅测试 serviceB 会更好吗?
测试部分应该如何解决这个依赖链?
我正在将 xunit 与 Mock 一起使用
我创建了一个小型 git 存储库,其中包含可以复制错误的项目https://github.com/masterxfile/xUnitExample/tree/main/WebApplication1
您可以简单地将模拟行为删除为严格。
private readonly Mock<IRepoA> _repoA = new();
private readonly Mock<ServiceB> _serviceB = new();
这使得模拟更加宽松,因为您现在可以完全控制要验证的内容。