想象一下,我们有下面的代码
public class test
{
public void Condition(x,y)
{
if (x == y)
{
methodOne();
}
else
{
methodTwo();
}
}
public void methodOne(){//do some database stuff}
public void methodTwo(){//do some database stuff}
}
我想断言,如果methodone在x==y时被调用,但不希望我的测试在methodone中执行代码,因为它会做一些数据库的事情。。。
我正在写这样的
MockRepository mockRepository=new MockRepository();
var Mock = mockRepository.PartialMock<test>();
mock.Replay();
mock.condition(1,1);
mock.AssertWasCalled(x=>x.methodOne);
mock.VerifyAllExpectations();
但它也试图在方法一中运行这些东西,我不想让我的测试进行数据库连接,我只需要确保我的条件有效,它是否被调用。
您将关注点、业务逻辑和数据访问混合在一个类中。你需要考虑单一责任原则和关注点分离。
您的public void Condition(x,y)
可能位于业务逻辑层中,而methodOne()
和methodTwo()
则位于Data Access Layer。
应该将数据访问层(IoC)注入到业务逻辑层中,以便对其进行模拟。这样,当您测试Condition方法时,您将传入一个实际上没有连接到数据库的模拟数据访问层。
这样,您就可以像现在这样检查Condition是否被调用,而不会产生任何副作用,比如写入数据库。当您遇到这样的情况时,它可以帮助您将代码分解为更好的体系结构,并最终引导您研究测试驱动开发。