смешивание окурков и насмешек в носороге - PullRequest
2 голосов
/ 14 июля 2009

Мой тест пытается подтвердить, что был вызван определенный метод dal с некоторыми параметрами. Метод возвращает объект DataSet, поэтому мой макет просто возвращает пустой DataSet при вызове.

Проблема, с которой я столкнулся, заключается в том, что когда SUT не вызывает dal с правильными параметрами, макет не возвращает пустое значение DataSet, и поэтому мой класс сгенерирует исключение при попытке доступа к нулевой ссылке. Это просто приводит к сбою теста с несвязанным сообщением в моем тестовом прогоне.

Я бы хотел заглушить метод, чтобы он возвращал пустое значение Dataset во всех случаях, чтобы метод работал правильно, и в конце теста убедитесь, что он был вызван с ожидаемыми параметрами. я слишком много прошу?

Ответы [ 2 ]

2 голосов
/ 14 июля 2009

Это должно быть сделано при условии, что ваш метод имеет аргумент int.

IDal dalMock = MockRepository.GenerateMock<IDal>();

// setup mock to return the emptyDataSet for any argument    
dalMock
  .Stub(x => x.GetDataSet(Arg<int>.Is.Anything))
  .Return(emptyDataSet)
  .Repeat.Any();

sut.Execute()

// assert that the argument had been 7
dalMock.AssertWasCalled(x => x.GetDataSet(Arg<int>.Is.Equal(7))

Документирование ограничений аргументов. (Я написал эту главу, поэтому вы можете спросить меня, если не понимаете; -)


При использовании .NET 2.0 это будет выглядеть примерно так:

MockRepository mocks = new MockRepository();
IDal dalMock = mocks.CreateDynamicMock<IDal>();

// expect the correct argument
Expect.Call(dalMock.GetDataSet(Arg<int>.Is.Equal(7)))
  .Return(emptyDataSet)
  .Repeat.Once();

// setup mock to return the emptyDataSet for any argument    
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything))
  .Return(emptyDataSet)
  .Repeat.Any();

sut.Execute()

// assert that the argument had been 7
mocks.VerifyAll();

Не уверен на 100%, работает ли он, но должен.

Вы также можете попробовать это:

// setup mock to return the emptyDataSet for any argument    
SetupResult.For(dalMock.GetDataSet(Arg<int>.Is.Anything))
  .Do((GetDataSetDelegate)delegate(int i)
    {
      Assert.AreEqual(7, i);
    }
  .Return(emptyDataSet)
  .Repeat.Any();

sut.Execute()

Do выполняется при вызове макета. Требуется делегат с точно таким же интерфейсом, что и у смоделированного метода. Из-за синтаксических причин .NET 2.0 вам необходимо привести его к правильному типу делегата, поэтому вам нужно сначала объявить его (GetDataSetDelegate в данном случае).

Примечание для пользователей Rhino 3.5: есть гораздо более удобный способ вызова: WhenCalled просто принимает лямбду в качестве аргумента, но должен быть реализован по-другому.

С помощью Do или WhenCalled соответственно вы можете реализовать утверждения аргументов при вызове макета.

0 голосов
/ 14 июля 2009

Вы пытались использовать частичные макеты с Mhino Rhino, как описано здесь . Я думаю, что если вы сделаете это, то получите то, что хотите.

...