Свойство Rhino moq.ограничение по значению

#rhino-mocks

#rhino-издевается

Вопрос:

Мой следующий прямой тест не проходит (хотя я чувствую, что должен). Либо я что-то упускаю, либо неясно ограничение Property.value. пожалуйста, помогите мне в понимании концепции ограничения property.value.

 public interface ISomeInterface
{
     void SomeMethod(string x, string y);
}
  

открытый класс someclassstest
{

 [Test]

public void SomeMethodTest()
    {

        MockRepository mocks = new MockRepository();
        ISomeInterface mockservice = mocks.StrictMock<ISomeInterface>();
        using (mocks.Record())
        {
            mockservice.SomeMethod("xValue", "yValue");
            LastCall.Constraints(Property.Value("x", "xValue"),
                                 Property.Value("y", "yValue"));
        }
        mockservice.SomeMethod("xValue", "yValue");
        mocks.Verify(mockservice);
    }
}
  

Возникло исключение:

Rhino.Издевается.Исключения.Исключение ExpectationViolationException : ISomeInterface.someMethod(«xValue», «yValue»); Ожидаемый # 0, фактический # 1. ISomeInterface.Некоторый метод (свойство ‘x’ равно xValue, свойство ‘y’ равно yValue); Ожидаемый # 1, фактический # 0.

Ответ №1:

Я бы порекомендовал вам следующий синтаксис (синтаксис AAA):

 // arrange
var mockservice = MockRepository.GenerateMock<ISomeInterface>();

// act
mockservice.SomeMethod("xValue", "yValue");

// assert
mockservice.AssertWasCalled(
    x => x.SomeMethod("xValue", "yValue")
);
  

Комментарии:

1. Спасибо за это (отмечено), но здесь мне больше интересно узнать об ограничении Property.Value. Когда я устанавливаю ограничения и передаю значения, которые должны их удовлетворять, почему это все еще не удается?

2. @enableDeepak, IIRC (синтаксис старый, и я могу ошибаться, поскольку прошло много времени, этот синтаксис устарел), но не Property.Value для проверки вызовов свойств? В вашем случае вы используете вызов метода.

Ответ №2:

Этот пример класса иллюстрирует варианты утверждения, что методы были вызваны с соответствующими свойствами:

 public class UsesThing
{
   private IMyThing _thing;

   public UsesThing(IMyThing thing)
   {
      _thing = thing;
   }

   public void DoTheThing(int myparm)
   {
      _thing.DoWork(myparm, Helper.GetParmString(myparm));
   }

   public void DoAnotherThing(int myparm)
   {
       AnotherThing thing2 = new AnotherThing();
       thing2.MyProperty = myparm   2;
       _thing.DoMoreWork(thing2)
    }
}
  

Использование простых значений для утверждений может работать для методов, подобных методу doTheThing, который использует типы значений:

 [Test]
public void TestDoTheThing()
{
    IMyThing thing = MockRepository.GenerateMock<IMyThing>();
    UsesThing user = new UsesThing(thing);

    user.DoTheThing(1);

    thing.AssertWasCalled(t => t.DoWork(1, "one");
}
  

Однако, если вам нужно создать объект в вашем методе и передать его в качестве параметра, как в методе DoAnotherThing, этот подход не сработает, поскольку у вас не будет ссылки на объект. Вы должны проверить значения свойств неизвестного объекта, вот так:

 [Test]
public void TestDoAnotherThing()
{
    IMyThing thing = MockRepository.GenerateMock<IMyThing>();
    UsesThing user = new UsesThing(thing);

    user.DoAnotherThing(1);

    thing.AssertWasCalled(t => t.DoMoreWork(null), t => t.IgnoreArguments().Constraints(Property.Value("MyProperty", 3))));        
}
  

Новый синтаксис Rhino будет выглядеть следующим образом, но при его использовании происходит сбой по сравнению с 2008 годом:

 thing.AssertWasCalled(t => t.DoMoreWork(Arg<AnotherThing>.Matches(Property.Value("MyProperty", 3))));