12

我开始使用起订量,但据我了解,即使我真的不关心它们,我也总是必须模拟所有可以调用的方法。

有时需要很长时间来模拟你忘记你想要做什么的东西。所以我一直在研究自动模拟,但我不确定我应该使用哪个。

AutoFixture 作为自动模拟容器

自动模拟

我根本不知道如何使用第一个。我有点得到第二个,但从未真正尝试过。

我不确定一个是否比另一个更好。我唯一知道的是我已经在使用 AutoFixtures,这是第一个依赖项。

因此,从长远来看,使用第一个可能是有意义的,但就像我说的那样,我找不到任何关于如何使用它的基本教程。

编辑

我正在尝试遵循“Nikos Baxevanis”示例,但遇到了错误。

Failure: System.ArgumentException : A matching constructor for the given arguments was not found on the mocked type.
  ----> System.MissingMethodException : Constructor on type 'DatabaseProxyded46c36c8524889972231ef23659a72' not found.


var fixture = new Fixture().Customize(new AutoMoqCustomization());
        var fooMock = fixture.Freeze<Mock<IFoo>>();
       // fooMock.Setup(x => x.GetAccounts(It.IsAny<IUnitOfWork>()));
        var sut = fixture.CreateAnonymous<AdminService>();

        sut.Apply();
        fooMock.VerifyAll();

我认为这是因为我的 petapoco unitOfWork 财产

PetaPoco.Database Db { get; }

不知道我是否必须以某种方式或什么来模拟这个。

4

1 回答 1

25

虽然我从未使用过moq-contrib Automocking,但我可能会提供一些关于使用AutoFixture作为自动模拟容器的信息。

目前支持 Moq、Rhino Mocks、FakeItEasy 和 NSubstitute。只需安装适当的扩展AutoMoqAutoRhinoMocksAutoFakeItEasyAutoNSubstitute

一旦你安装了 Auto Mocking 的扩展之一,额外的调用是:

var fixture = new Fixture()
    .Customize(new AutoMoqCustomization());

(或者如果您使用的是 Rhino Mocks)

var fixture = new Fixture()
     .Customize(new AutoRhinoMockCustomization());

(或者如果您使用的是 FakeItEasy)

var fixture = new Fixture()
     .Customize(new AutoFakeItEasyCustomization());

(或者如果您使用的是 NSubstitute)

var fixture = new Fixture()
     .Customize(new AutoNSubstituteCustomization());

示例 1

public class MyController : IController
{
    public MyController(IFoo foo)
    {
    }
}

public interface IFoo
{
}

下面是如何使用 AutoFixture 创建MyController类的实例:

var fixture = new Fixture()
    .Customize(new AutoMoqCustomization());

var sut = fixture.CreateAnonymous<MyController>();

现在,如果您检查sut变量,您将看到它IFoo是一个模拟实例(具有类似于 Castle.Proxies.IFooProxy 的类型名称)

示例 2

这个例子扩展了前面的例子。

您可以指示 AutoFixture 使用您自己的、预先配置的、模拟的实例:

var fooMock = fixture.Freeze<Mock<IFoo>>();
// At this point you may setup expectation(s) on the fooMock.

var sut = fixture.CreateAnonymous<MyController>();
// This instance now uses the already created fooMock.
// Verify any expectation(s).

基本上就是这样——但它可以走得更远!

下面是前面使用带有 xUnit.net 扩展名的 AutoFixture示例

示例 1

[Theory, AutoMoqData]
public void TestMethod(MyController sut)
{
    // Start using the sut instance directly.
}

示例 2

[Theory, AutoMoqData]
public void TestMethod([Frozen]Mock<IFoo> fooMock, MyController sut)
{
   // At this point you may setup expectation(s) on the fooMock.
   // The sut instance now uses the already created fooMock.
   // Verify any expectation(s).
}

您可以在此博客文章中找到更多信息,其中包含与 AutoFixture、xUnit.net 和 Auto Mocking 相关的所有内容的链接。

希望有帮助。

于 2012-10-13T07:42:38.677 回答