在同一个TestFixture中将dependecy用作具体实现和模拟

问题描述 投票:1回答:2

我有一个TestFixture类,可以在当前项目中练习一些代码。在大多数情况下,我会将某些依赖项的实际,具体实现提供给SUT。但是,我遇到了一个不希望使用真实事物的情况。由于我使用自定义AutoDataAttribute创建SUT,因此除非我手动创建所有详细信息,否则现在似乎已经失去了将所需的依赖项替换为模拟对象的能力。

SUT通过构造函数注入获得所有依赖关系:

public class MyService {
  private readonly IDependency dependency;

  public MyService(IDependency dependency, ...) {
    ...
    this.dependency = dependency ?? throw new ArgumentNullException();
    ...
  }
}

这是我的测试类的样子:

[TestFixture]
public class MyServiceTest {
  [Test, CustomAutoMock]
  public void TestCase1(int id, MyService sut) {
    ...
    sut.Dependency.Configure( ... );
    ...
    sut.DoSomethingWith(id);
    ...
    }

  [Test, CustomAutoMock]
  public void TestCase2(string searchString, MyService sut) {
    ...
    sut.Dependency.Configure( ... );
    ...
    sut.FindSomethingMatching(searchString);
    ...
    }

  ...

  [Test, CustomAutoMock]
  public void TestCaseN([Frozen] Mock<IDependency> mockDependency, MyService sut) {
    ...
    mockDependency.SetUp(o => o.DoSomething()).Throws<InvalidOperationException>();
    ...
    sut.Exercise();
    ...
    }
}

这是CustomAutoMockAttribute:

class CustomAutoMockAttribute : AutoDataAttribute {
  public CustomAutoMockAttribute() : base(InitializeCustomFixture) { }

  public static Fixture InitializeCustomFixture() {
    var fixture = new Fixture();

    fixture.Customize(new AutoMoqCustomization { ConfigureMembers = true });

    ...

    fixture.Register<IDependency>(() => fixture.Create<ConcreteDependency>());

    ...

    return fixture;
  }
}

实际上MyService的构造函数需要18个参数! (不要这样看我,这是被传递给我的[[legacy

代码🙁)。这就是AutoFixture如此省时省力的主要原因之一。控制一点一点。MyServiceTest.TestCaseN中,我希望SUT能够获得模拟的依赖关系,但是无论如何,它总是会获得ConcreteDependency的实例。

有什么方法可以配置AutoFixture将mockDependency馈送到SUT中?[[无

我必须手动创建所有内容?

我有一个TestFixture类,可以在当前项目中执行一些代码。在大多数情况下,我会将某些依赖项的实际,具体实现提供给SUT。但是,我遇到了一个...

.net unit-testing nunit moq autofixture
2个回答
1
投票

1
投票
© www.soinside.com 2019 - 2024. All rights reserved.