说我有课:
public class SomeClass {
public Model _model;
public SomeClass() {
_model = new Model();
}
public void Foo() {
_model.DoSomethingHeavy();
}
}
并且测试:
[TestFixture]
public class SomeClassTest {
[Test]
public void TestFooCalledSomethingHeavy() {
SomeClass someClass = NSubstitute.Substitute.For<SomeClass>();
someClass.Foo();
someClass._model.Received().DoSomethingHeavy();
}
}
我试图测试someClass.Foo();名为_model.DoSomethingHeavy(),但我实际上并不想要运行DoSomethingHeavy。我该怎么办?或者这是错误的做法?
答案 0 :(得分:4)
对于使用NSubstitute的方法的重写行为,该方法需要是接口或虚方法的一部分。
首先确保DoSomethingHeavy
类
Model
(更好 - &gt;提供更多测试可能性)
public interface IModel
{
void DoSomethingHeavy();
}
在Model
班级
public class Model : IModel
{
public void DoSomethingHeavy()
{
// heavy staff
}
}
然后,对测试非常重要 - &gt;删除在Model
SomeClass
实例的责任
public class SomeClass
{
public Model _model { get; private set; }
// Constructor will sure, that class get an instance of IModel
public SomeClass(IModel model)
{
_model = model;
}
public void Foo()
{
_model.DoSomethingHeavy();
}
}
现在你可以创建假IModel
并检查执行方法DoSomethingHeavy
而不运行实际实现。
因为SomeClass
是测试中的类,所以你不需要模拟它 - 你将测试该类的行为。
[Test]
public void TestFooCalledSomethingHeavy()
{
// Arrange
IModel fakeModel = Substitute.For<IModel>();
SomeClass someClass = new SomeClass(fakeModel);
// Act
someClass.Foo();
// Assert
fakeModel.Received().DoSomethingHeavy();
}