模拟问题

时间:2009-06-11 06:28:28

标签: unit-testing mocking

// IsExist总是假的,这是一个错误吗?

  [TestMethod]
   public void IsExist()
   {
       private Mock<IRepository> repository = new Mock<IRepository>();
                   Foo f = new Foo();
                   repository.Expect(s => s.IsExist(foo)).Returns(true);
       var controller = new MyController(repository.Object);
       var result = (ViewResult)controller.DoSometing();

   }

           public class MyController : Controller
           {

           IRepository _repository ;

           public MyController(IRepository repository)
   {
       _repository = repository;

   }

           public ViewResult DoSometing()
   {
       bool IsExist = _repository.IsExist(new Foo());
                   //IsExist always false,is it a bug?
       return View(foo);
   }

           }

2 个答案:

答案 0 :(得分:1)

首先,您使用的是哪个模拟库(答案可能会因此而改变)?

我知道如果你使用的是Rhino Mocks,问题就是当你收到你在顶部创建的foo特定实例时,你的期望被设置为返回true。这是在控制器中执行时传递的内容的不同实例,因此返回false(因为没有针对 foo对象的版本设置的期望)。更清楚的是,如果你有这个代码:

Foo f1 = new Foo();
Foo f2 = new Foo();
repository.Expect(s => s.IsExist(f1)).Returns(true);
bool b1 = repository.Object.IsExist(f1);
bool b2 = repository.Object.IsExist(f2);

我希望b1是真的(因为这是您设置的具体期望,即给定f1返回true)并且b2将是假的(因为如果收到f2,你没有告诉存储库做任何具体的事情,所以它会回归到返回false的默认行为。

在Rhino Mocks中,您需要设置这样的期望:

repository.Expect(s => s.IsExist(Arg<Foo>.Is.TypeOf)).Returns(true);

如果使用 Foo对象的任何实例调用IsExist,则返回true。如果您需要更具体,可以使用以下内容:

repository.Expect(s => s.IsExist(f => f.SomeProperty == "blah" && f.OtherProperty.StartsWith("baz")))).Returns(true);

如果foo.SomeProperty等于"blah"foo.OtherProperty"baz"开头,则返回true。

看起来你没有使用Rhino Mocks,因为你的语法有点不同,但希望能指出你正确的方向......

答案 1 :(得分:0)

在检查对象属性是否存在之前,使用某些值初始化对象属性。

 public ViewResult DoSometing()
   {
       Foo obj = new Foo();
       obj.Property1 = "some value";
       bool IsExist = _repository.IsExist(obj);
                   //IsExist always false,is it a bug?
       return View(foo);
   }