【问题标题】:How to create Mock classes in AutoDataAttribute subclasses?如何在 AutoDataAttribute 子类中创建 Mock 类?
【发布时间】:2020-11-24 07:04:09
【问题描述】:

我目前有一个名为 ExampleViewModelAttribute 的类,它从 TestViewModelDataAttribute 派生而来,TestViewModelDataAttribute 是从 AutoDataAttribute 类派生的类。

public class TestViewModelDataAttribute : AutoDataAttribute
{
    public TestViewModelDataAttribute()
        : this(new Fixture())
    {

    }

    public TestViewModelDataAttribute(IFixture fixture)
        : base(fixture)
    {
        Fixture.Customize(new ViewModelsCustomization());
        Fixture.Inject(Fixture);
    }
}


public class ExampleViewModelAutoDataAttribute : TestViewModelAutoDataAttribute
{
    public ExampleViewModelAutoDataAttribute()
    {
        var someExampleMock = Fixture.Create<Mock<ISomeExampleMock>>();
        Fixture.Inject(someExampleMock);
    }
}

我的问题,是我不断收到警告“为了提高性能效率而延迟创建了夹具,因此不推荐使用此属性,因为它会立即激活夹具。” + “如果您需要自定义夹具,请在传递给构造函数的工厂方法中进行。”

如何解决此警告?我想在夹具中注入模拟类,我只有一个答案可以帮助我修复基类警告,但我还需要修复注入模拟类。

修复基类

public class TestViewModelDataAttribute : AutoDataAttribute
{
    public TestViewModelDataAttribute() : base(() =>
    {
        var fixture = new Fixture().Customize(new CompositeCustomization(
            new AutoMoqCustomization(),
            new SupportMutableValueTypesCustomization()));

        return fixture;
    })
    {
    }
}

我从以下答案When setting up a custom AutoDataAttribute for auto mocking, what's the proper syntax to tell AutoFixture to ignore all recursive structures?得到的

但是由于我在派生类中使用了 Fixture 的属性,所以我仍然会出错。我应该如何解决这个问题? 谢谢

【问题讨论】:

    标签: xunit.net autofixture


    【解决方案1】:

    您不应使用 AutoDataAttribute 中的 Fixture 属性,它可能会在版本 5 中被删除。

    如果您尝试在将模拟注入测试之前对其进行设置,则可以尝试创建一个自定义来执行此操作。

    public class MockValuesSetupCustomization : ICustomization
    {
        public void Customize(IFixture fixture)
        {
            var myMock = fixture.Freeze<Mock<ISomeExampleMock>>();
            myMock.Setup(x => x.DoSomething()).Returns("something");
        }
    }
    

    当您自定义您的 autodata 属性时,您可以使用此自定义来自定义夹具。

    public class TestViewModelDataAttribute : AutoDataAttribute
    {
        public TestViewModelDataAttribute()
           : base(() => new Fixture()
                .Customize(
                    new CompositeCustomization(
                        new AutoMoqCustomization(),
                        new SupportMutableValueTypesCustomization(),
                        new MockValuesSetupCustomization())))
        {
        }
    }
    

    如果你只是需要一些依赖来解决Mock&lt;ISomeExampleMock&gt;,那么你不需要做任何事情,因为AutoMoqCustomization 会自动为任何接口创建模拟。 然后,您可以通过将它们冻结在测试方法参数中来访问这些注入的模拟。

    假设您使用的是 xUnit,您的测试将如下所示。

    [Theory]
    [TestViewModelData]
    public void ShouldReturnExpectedResult(
        [Frozen] Mock<ISomeExampleMock> someExampleMock,
        ClassUnderTest sut)
    {
        sut.DoStuff();
    
        someExampleMock.Verify(x => x.DoSomething(), Times.Once);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-13
      • 2019-05-03
      • 1970-01-01
      • 2013-12-06
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多