为什么 AutoFixture 的 AutoMoqData 不创建模拟对象?
Why does AutoFixture's AutoMoqData not create mock objects?
我正在编写 (NUnit) 个针对类型 MyService
的组件的单元测试。示例:
public class MyService : IMyService
{
private readonly IMyRepo _myRepo;
public MyService (IMyRepo myRepo)
{
_myRepo = myRepo;
}
public MyService ()
{
_myRepo = new MyRepo();
}
...
}
我正在尝试使用 AutoFixture as a factory that will generate my test target. I am also trying to have it (AutoFixture) populate my target with mock dependencies (using Moq).
这是我的尝试:
[Test, AutoMoqData]
public void MyTest(MyService target)
{
...
}
[AutoMoqData]
属性(基于 @ploeh's blog post)使用 AutoFixture 的 AutoMoqCustomization
特性扩展了 AutoFixture 的 [AutoData]
属性:
public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute()
: base(new Fixture()
.Customize(new AutoMoqCustomization()))
{
}
}
当我运行 基于上述进行单元测试时,我想获得一个 MyService
的真实实例,其中包含 Mock<IMyRepo>
依赖项。
相反,我得到了 MyRepo
的具体实例。
似乎 AutoMoqCustomization
选择调用最简单的构造函数 - 不带参数的构造函数。 如何配置AutoMoqCustomization
忽略它并实例化第二个构造函数?
PS - 以下是正在使用的相关 nuget 包的列表:
<package id="AutoFixture" version="3.50.2" targetFramework="net452" />
<package id="AutoFixture.AutoMoq" version="3.50.2" targetFramework="net452" />
<package id="AutoFixture.NUnit3" version="3.50.2" targetFramework="net452" />
<package id="Moq" version="4.5.29" targetFramework="net452" />
<package id="NUnit" version="3.5.0" targetFramework="net452" />
您可以尝试 define a greedy constructor selection algorithm for AutoFixture,但实际上,最好的解决方案是删除无参数构造函数:
public class MyService : IMyService
{
private readonly IMyRepo _myRepo;
public MyService (IMyRepo myRepo)
{
_myRepo = myRepo;
}
}
拥有无参数构造函数是一种代码味道,称为Bastard Injection。在大多数情况下,没有充分的理由。
在我看来,最好的选择是应用 GOOS 听力测试原则。当测试变得难以编写时,就该重新考虑被测系统 (SUT) 的设计了。 AutoFixture 倾向于放大这种效果。这就是这里发生的事情。
我正在编写 (NUnit) 个针对类型 MyService
的组件的单元测试。示例:
public class MyService : IMyService
{
private readonly IMyRepo _myRepo;
public MyService (IMyRepo myRepo)
{
_myRepo = myRepo;
}
public MyService ()
{
_myRepo = new MyRepo();
}
...
}
我正在尝试使用 AutoFixture as a factory that will generate my test target. I am also trying to have it (AutoFixture) populate my target with mock dependencies (using Moq).
这是我的尝试:
[Test, AutoMoqData]
public void MyTest(MyService target)
{
...
}
[AutoMoqData]
属性(基于 @ploeh's blog post)使用 AutoFixture 的 AutoMoqCustomization
特性扩展了 AutoFixture 的 [AutoData]
属性:
public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute()
: base(new Fixture()
.Customize(new AutoMoqCustomization()))
{
}
}
当我运行 基于上述进行单元测试时,我想获得一个 MyService
的真实实例,其中包含 Mock<IMyRepo>
依赖项。
相反,我得到了 MyRepo
的具体实例。
似乎 AutoMoqCustomization
选择调用最简单的构造函数 - 不带参数的构造函数。 如何配置AutoMoqCustomization
忽略它并实例化第二个构造函数?
PS - 以下是正在使用的相关 nuget 包的列表:
<package id="AutoFixture" version="3.50.2" targetFramework="net452" />
<package id="AutoFixture.AutoMoq" version="3.50.2" targetFramework="net452" />
<package id="AutoFixture.NUnit3" version="3.50.2" targetFramework="net452" />
<package id="Moq" version="4.5.29" targetFramework="net452" />
<package id="NUnit" version="3.5.0" targetFramework="net452" />
您可以尝试 define a greedy constructor selection algorithm for AutoFixture,但实际上,最好的解决方案是删除无参数构造函数:
public class MyService : IMyService
{
private readonly IMyRepo _myRepo;
public MyService (IMyRepo myRepo)
{
_myRepo = myRepo;
}
}
拥有无参数构造函数是一种代码味道,称为Bastard Injection。在大多数情况下,没有充分的理由。
在我看来,最好的选择是应用 GOOS 听力测试原则。当测试变得难以编写时,就该重新考虑被测系统 (SUT) 的设计了。 AutoFixture 倾向于放大这种效果。这就是这里发生的事情。