我有一个sut
与依赖关系:
public interface IDep
{
void Click(int c);
}
public class Sut
{
public Sut(IDep dep)
{
dep.Click(10);
}
}
在我的测试中,我想检查Click
是否被调用,但它没有被冻结就不能工作。
var fixture = new Fixture().Customize(
new AutoNSubstituteCustomization { ConfigureMembers = true }
);
//fixture.Freeze<IDep>(); // uncommenting this line make it working
fixture.Create<Sut>();
fixture.Freeze<IDep>()
.Received(1)
.Click(Arg.Any<int>);
在我的测试中,我想检查Click是否被调用,但它不工作而不被冻结。
这是故意的。冻结行是捕获单个模拟依赖项所必需的。
在这种情况下,注入SUT的依赖项和您尝试冻结后获得的依赖项将是不同的实例。这就是为什么您的特定测试用例失败的原因。
我建议保留第一行,并将返回值传递给变量。在本例中,您可以在执行SUT之后对变量执行断言。
例如
var fixture = new Fixture().Customize(
new AutoNSubstituteCustomization { ConfigureMembers = true }
);
//Arrange
IDep dependency = fixture.Freeze<IDep>();
//...any configuration needed on the mock can be done here
//Act
Sut sut = fixture.Create<Sut>(); //frozen dependency will be injected into sut.
//Assert
dependency.Received(1).Click(Arg.Any<int>);
我建议回顾快速入门,以便更好地理解Freeze
功能的目的
幸运的是,我们可以告诉fixture"冻结"特定类型。这意味着每次请求冻结类型的实例时,都将获得相同的实例。你可以把它想象成在IoC容器中注册一个单例实例。