我试图使用AutoFixtureAutofixture.Idioms简化构造函数中保护条件的测试。我正在使用以下熟悉的,几乎重复的方法进行测试:

[TestMethod]
public void DependencyConsumerContainsAGuardCondition ( )
{
    var fixture = new Fixture ( );
    var assertion = new GuardClauseAssertion ( fixture );
    assertion.Verify ( typeof ( DependencyConsumer ).GetConstructors ( ) );
}


DependencyConsumer的构造函数是具体类型时,运行测试没有问题:

public interface IDependency { }

public class ConcreteDependency : IDependency { }

public class DependencyConsumer
{
    public DependencyConsumer(ConcreteDependency dependency)
    {
        if (dependency == null)
        {
            throw new ArgumentNullException ( "dependency" );
        }
    }
}


但是,当我将构造函数参数的类型更改为IDependency时,测试失败,并出现以下异常(为便于阅读而重新格式化)

Test method
    AutomatedTestingPlayground.Playground.DependencyConsumerContainsAGuardCondition
    threw exception:
Ploeh.AutoFixture.Idioms.GuardClauseException: AutoFixture was unable to
    create an instance for parameter "dependency" of method ".ctor".
Method Signature: Void .ctor(AutomatedTestingPlayground.IDependency)
Declaring Type: AutomatedTestingPlayground.DependencyConsumer
Reflected Type: AutomatedTestingPlayground.DependencyConsumer --->
    Ploeh.AutoFixture.ObjectCreationException: AutoFixture was unable to
    create an instance from AutomatedTestingPlayground.IDependency, most
    likely because it has no public constructor, is an abstract or
    non-public type.

Request path:
      AutomatedTestingPlayground.IDependency


我的测试设置代码中缺少什么?我是否需要显式模拟IDependency并将其作为构造函数参数提供?鉴于AutoFixture的既定目标(“零摩擦TDD”)以及此类构造函数的出现频率,我不确定为什么在抽象类型而不是抽象类型时需要模拟构造函数参数的原因具体类型。

最佳答案

默认情况下,AutoFixture将仅创建您可以new向上的类型。无法创建抽象类型/接口。如果您添加各种AutoFixture-Mocking组件之一,则它们可以将AutoFixture变成AutoMocking容器。因此,当它检测到您正在传递抽象类型/接口而不是感到困惑时,它将为您创建Mocks。

自动模拟版本包括:


AutoFixture.AutoMoq
AutoFixture.AutoNSubstitute
AutoFixture.AutoRhinoMocks
AutoFixture.AutoFakeItEasy

关于c# - 针对接口(interface)类型的参数的保护条件的自动固定测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31082476/

10-13 08:17