在具体实现中使用 AutoFixture 创建的 mock

Using a AutoFixture created mock in a concrete implementation

我有以下关于 AutoFixture 的问题,在代码中有解释

public SUT(IConcrete concrete)
{
    DTO BuildDTO()
    {
         return new DTO 
         {
             URL = concrete.GetString(arg1, arg2);
         };
    }
}

public Concrete : IConcrete
{
    public Concrete(ISomeHandler someHandler)
    {
        ...
    }

    public GetString(obj arg1, obj arg2)
    {
        return someHandler.GetUri(arg1, arg2);
    }
}

public void Test(
[Frozen] Mock<ISomeHandler> someHandler,
SUT mySUT)
{
    someHandler.Setup(...);
    mySUT.DoStuff();
    //assert everything went as expected
}

我的问题很简单,我如何用 AutoFixture 注册 IConcrete,这样我就可以访问应该在测试用例中注入的冻结模拟?

实际上,这是关于将 HttpRequestMessage 注入 URL 解析器,该解析器在处理程序中使用,从 Web API 项目中的控制器调用。

我已尝试使用创建的模拟自动夹具注册 IConcrete

fixture.Register<IConcrete>(new Mock<ISomeHandler>());

但是我无法在单元测试中访问此模拟并设置 return 值。

在此先感谢您提供的所有帮助:)

为了允许 AutoFixture 生成 mocks,需要启用 AutoMocking Container

您需要执行以下操作:

  1. 创建 AutoMoqAttribute:

    public class AutoMoqDataAttribute : AutoDataAttribute
    {
      public AutoMoqDataAttribute()
        : base(new Fixture().Customize(new AutoMoqCustomization()))
      {
      }
    }
    
  2. 使用新属性装饰您的测试:

    [Theory, AutoMoqData]
    public void Test(
      [Frozen] Mock<ISomeHandler> someHandler,
      Sut sut)
    {
      someHandler.Setup(s => s.DoStuff()).Returns("123");
      Assert.Equal("123", sut.SomeHandler.DoStuff());
    }
    

其中 SutISomeHandler 如下:

public class Sut
{
  public Sut(ISomeHandler someHandler)
  {
    SomeHandler = someHandler;
  }

  public ISomeHandler SomeHandler { get; }
}

public interface ISomeHandler
{
  string DoStuff();
}