单元测试和起订量,最佳解决方案

问题描述 投票:0回答:1

我有以下场景,我想知道测试我的服务的正确方法是什么。我有 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

c# unit-testing mocking xunit
1个回答
0
投票

您可以简单地将模拟行为删除为严格。

    private readonly Mock<IRepoA> _repoA = new();
    private readonly Mock<ServiceB> _serviceB = new();

这使得模拟更加宽松,因为您现在可以完全控制要验证的内容。

© www.soinside.com 2019 - 2024. All rights reserved.