想象一下,我们有以下代码
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}
}
我想断言如果在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();
但是它试图在方法1中运行运行的东西,我不希望我的测试做数据库连接,我只需要确保我的条件是有效的,它是否调用。
答案 0 :(得分:2)
您将关注点,业务逻辑和数据访问混合在一个类中。您需要考虑Single Responsibility Principle和Separation of concerns。
您的public void Condition(x,y)
应该位于业务逻辑层中,methodOne()
且methodTwo()
位于数据访问层中。
应将数据访问层(IoC)注入业务逻辑层,以便将其模拟出来。这样,当您测试Condition方法时,您将传入一个实际上并未连接到数据库的模拟数据访问层。
通过这种方式,您可以像现在一样检查条件是否被调用,没有像写入数据库那样的任何副作用。遇到这种情况时,它可以帮助您将代码分解为更好的架构,最终可以引导您调查Test Driven Development。