2009-06-11 2 views
0

// IsExist всегда ложный, это ошибка?mock problem

[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); 
    } 

      } 

ответ

1

Во-первых, какую издевательскую библиотеку вы используете (ответ может измениться на основе этого)?

Я знаю, что если вы используете Rhino Mocks, проблема в том, что ваше ожидание настроено на возвращение true, когда он получает этот конкретный экземпляр foo, который вы создаете вверху. Это другой экземпляр того, что передается, когда он выполняется в вашем контроллере, поэтому он возвращает 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); 

которая возвращает истину, если IsExist была вызвана любого экземпляра объекта Foo. Если вам нужно быть более конкретным, вы могли бы иметь что-то вроде этого:

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

которая возвращает истину, если foo.SomeProperty составил "blah" и foo.OtherProperty начал с "baz".

Не похоже, что вы используете Rhino Mocks, так как ваш синтаксис немного отличается, но, надеюсь, что указывает на вас в правильном направлении ...

+0

u правый.i погрешность. – tobias

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); 
    } 
+0

interesting.thanks Марван. – tobias