Unit testing 使用在具体实现中创建的自动夹具

Unit testing 使用在具体实现中创建的自动夹具,unit-testing,autofixture,Unit Testing,Autofixture,我有以下关于AutoFixture的问题,在代码中解释 public SUT(IConcrete concrete) { DTO BuildDTO() { return new DTO { URL = concrete.GetString(arg1, arg2); }; } } public Concrete : IConcrete { public Concrete(ISomeH

我有以下关于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
}
公共SUT(混凝土)
{
DTO BuildDTO()
{
返回新DTO
{
URL=concrete.GetString(arg1,arg2);
};
}
}
公共混凝土:IConcrete
{
公共混凝土(等径混凝土)
{
...
}
公共GetString(对象arg1、对象arg2)
{
返回someHandler.GetUri(arg1,arg2);
}
}
公共空隙试验(
[冻结]模拟处理程序,
苏特迈苏特)
{
someHandler.Setup(…);
mySUT.DoStuff();
//一切如期进行
}
我的问题很简单,我如何用AutoFixture注册IConcrete,这样我就可以访问冻结的mock,该mock应该在测试用例中注入它

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

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

fixture.Register<IConcrete>(new Mock<ISomeHandler>());
fixture.Register(新Mock());
但是,我无法在单元测试中访问此模拟并设置返回值


提前感谢所有帮助:)

为了允许自动夹具生成模拟,需要启用该功能

您需要执行以下操作:

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

  public ISomeHandler SomeHandler { get; }
}

public interface ISomeHandler
{
  string DoStuff();
}
  • 创建
    自动moqAttribute

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

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

    如果
    SUT
    依赖于
    IConcrete
    ,那么为什么还要关心
    ISomeHandler
    ?我关心ISomeHandler,因为它正在输出url,我想验证它是否正确生成。在提供的代码中,
    SUT
    isomHandler
    之间没有交互
    SUT
    仍然不与
    isomHandler
    交互。它调用
    IConcrete.GetString
    。您只需要为
    IConcrete
    提供一个双重测试。谢谢Mark-我意识到我需要自己测试IConcrete,然后在这种情况下使用SUT,我可以使用autofixture生成的URL,因为我知道IConcrete本身将生成正确的URL。