通过构造函数或属性在 Nunit 测试 类 中进行依赖注入

Dependency Injection in Nunit test classes via contructor or properties

我有在 IUnityContainer(Unity 框架)中注册的具有适当实现的 IInterface 实现:

public interface IInterface
{
    void Foo();
}

public class Realization : IInterface
{
    public void Foo() => Console.WriteLine("Test");
}

public class BaseFixture
{
    protected IUnityContainer Container { get; set; }

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        Container = new UnityContainer()
            .RegisterType<IInterface, Realization>();
    }
}

我有 Nunit TestFixture class,我在其中尝试以两种方式解决依赖关系:

构造函数:

[TestFixture]
public class MyTestClass1: BaseFixture
{
    public IInterface MyProp { get; set; }

    public MyTestClass1(IInterface instance)
    {
        MyProp = instance;
    }

    [Test]
    public void MyTest1()
    {
        MyProp.Foo();
    }
}

属性:

[TestFixture]
public class MyTestClass2 : BaseFixture
{
    [Dependency]
    public IInterface MyProp { get; set; }

    [Test]
    public void MyTest2()
    {
        MyProp.Foo();
    }
}

在第一种情况下(构造函数注入)我在运行时遇到下一个异常:

OneTimeSetUp: No suitable constructor was found

在第二种情况下(属性 注入)属性 没有初始化并且有 null 值。

如果有人可以建议使用 属性 或构造函数注入的解决方案,我将不胜感激。 我搜索过的唯一解决方案是:https://github.com/kalebpederson/nunit.dependencyinjection, 但不确定这是最好的。

谢谢。

为什么你想在你的测试中引入依赖注入?这不是常见的做法。将接口实现注入单元测试是没有用的。

您不想测试接口,并且您不能测试接口(除非您使用默认实现,但那是另一回事)。

您想测试接口的具体实现,Realization。所以您的测试将如下所示:

[TestFixture]
public class MyTestClass1
{
    [Test]
    public void MyTest1()
    {
        // Arrange
        var classUnderTest = new Realization();
        
        // Act
        classUnderTest.Foo();
        
        // Assert
        // TODO: assertions
    }
}

您在问题的代码中尝试做的所有事情都具有完全相同的目的并且实现完全相同,使用 DI 容器。这只是带有额外步骤的单元测试。

如果您确实想要这个,可以使用您 link 的库。这指示 NUnit 框架调用您的依赖注入框架来为您的测试提供注入。

但是,再说一次,不要那样做。你想测试 Realization,然后测试 Realization。不要让自己经历额外的、不必要的麻烦来获得测试接口。