0

想象一下,我们有以下代码

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();

但它也尝试运行方法一中的东西,我不希望我的测试进行数据库连接,我只需要确保我的条件正常工作并且它是否调用。

4

1 回答 1

2

您将关注点、业务逻辑和数据访问混合在一个类中。您需要考虑单一职责原则关注点分离

public void Condition(x,y)可能应该在具有数据访问层的业务逻辑层methodOne()中。methodTwo()

应该将数据访问层 ( IoC ) 注入到业务逻辑层中,以便对其进行模拟。这样,当您测试 Condition 方法时,您将传入一个实际上并不连接到数据库的模拟数据访问层。

这样您就可以像现在一样检查 Condition 是否被调用,而不会产生任何副作用,例如写入数据库。当您遇到这样的情况时,它可以帮助您将代码分解为更好的架构,并最终引导您研究测试驱动开发

于 2013-02-05T10:04:51.670 回答