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

时间:2016-07-14 10:05:42

标签: unit-testing autofixture

我有关于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解析器,该解析器在Handler中使用,从Web API项目中的控制器调用。

我试图用自动混合创建模拟

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

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

提前感谢您提供任何帮助:)

1 个答案:

答案 0 :(得分:3)

为了允许AutoFixture生成模拟,需要启用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());
    }
    
  3. SutISomeHandler如下:

    public class Sut
    {
      public Sut(ISomeHandler someHandler)
      {
        SomeHandler = someHandler;
      }
    
      public ISomeHandler SomeHandler { get; }
    }
    
    public interface ISomeHandler
    {
      string DoStuff();
    }