Скажем, у меня есть интерфейс IFoo, над которым я издеваюсь. В этом интерфейсе есть 3 метода. Мне нужно проверить, что тестируемая система вызывает хотя бы один из трех методов. Меня не волнует, сколько раз или с какими аргументами он вызывает, но случай, когда он игнорирует все методы и не касается макета IFoo, является случаем сбоя.
Я просматривал документацию Expect.Call, но не нашел простого способа сделать это.
Есть идеи?





Вы можете дать rhino имитировать лямбду для запуска при вызове функции. Затем эта лямбда может увеличивать счетчик. Утвердите счетчик> 1, и все готово.
Комментарий Дона Киркби: Я считаю, что Мендельт имеет в виду метод До.
Спасибо за полезный комментарий к моему слишком короткому ответу. Добавил в вопрос.
Не уверен, что это отвечает на ваш вопрос, но я обнаружил, что если мне нужно сделать что-то подобное с Rhino (или любой подобной структурой / библиотекой), все, что я не знал, как сделать заранее, тогда мне лучше просто создать ручной макет.
Создание класса, реализующего интерфейс и устанавливающего для публичного логического поля значение true, если вызывается какой-либо из методов, будет тривиально просто, вы можете дать классу описательное имя, что означает, что (что наиболее важно) следующий человек, просматривающий код, немедленно понимать это.
Если я вас правильно понял, вы хотите проверить, вызывается ли интерфейс хотя бы один раз для любого из трех указанных методов. Просматривая краткая справка, я не думаю, что вы можете сделать это в Rhino Mocks.
Интуитивно я думаю, что вы пытаетесь написать хрупкий тест, которым является плохая вещь. Это подразумевает неполную спецификацию тестируемого класса. Я призываю вас продумать дизайн так, чтобы тестируемый класс и тест имели известное поведение.
Однако, чтобы быть полезным с примером, вы всегда можете сделать это так (но не).
[TestFixture]
public class MyTest {
// The mocked interface
public class MockedInterface implements MyInterface {
int counter = 0;
public method1() { counter++; }
public method2() { counter++; }
public method3() { counter++; }
}
// The actual test, I assume you have the ClassUnderTest
// inject the interface through the constructor and
// the methodToTest calls either of the three methods on
// the interface.
[TestMethod]
public void testCallingAnyOfTheThreeMethods() {
MockedInterface mockery = new MockedInterface();
ClassUnderTest classToTest = new ClassUnderTest(mockery);
classToTest.methodToTest();
Assert.That(mockery.counter, Is.GreaterThan(1));
}
}
(Кто-нибудь, проверьте мой код, я написал это прямо сейчас и не писал ни слова на C# уже около года)
Мне интересно знать, почему вы это делаете.
Одна ошибка: класс MockedInterface должен публично открывать поле счетчика. Написано как есть, это просто личное поле.
@Andrei Rinea: На самом деле MyTest знает все внутреннее устройство MockedInterface, потому что это внутренний класс. Я был удивлен, когда заметил, что случайно создал частное поле во внутреннем классе, но обнаружил, что оно все еще доступно для внешнего класса.
Я считаю, что Мендельт имеет в виду метод До.