Тестирование, если другой метод на том же объекте был вызван с тестированием targetObject - PullRequest
1 голос
/ 19 июля 2010
public Class Test{
   GetDataset(RandomBoolean uncertain);
   GetDataset2();
   GetDataset3();
}

где определения методов

    public virtual void GetDataset2(){}
    public virtual void GetDataset3(){}

    public virtual void GetDataset(RandomBoolean uncertain)
    {
     if (uncertain.State){
            GetDataset2();
    }
     else{
       GetDataset3();
     }
    }

    //mocking uncertain.State to return true
    //ACT
    testObject.GetDataset(uncertainMock);

Я хочу проверить, был ли GetDataset2 () вызываться изнутри, когда я воздействую на testObject.GetDataset (); Я не издеваюсь над testObject, потому что это тестовый объект, поэтому, если я попытаюсь сделать

testObject.AssertWasCalled(x => x.GetDataset2());

Это не позволит мне сделать это, потому что testObject не является поддельным объектом. Я использую Rhino Mocks 3.5, я определенно что-то здесь упускаю. Каков наилучший способ достичь этого.

Ответы [ 4 ]

3 голосов
/ 19 июля 2010

Короткий ответ: вы не можете.С другой стороны, обычно вы не хотите.Когда вы проводите модульное тестирование класса, вы хотите убедиться, что класс выполняет свои вычисления правильно и имеет правильные побочные эффекты.Вы не должны проверять внутренности класса, потому что это приводит к тому, что соединение реального кода и тестов будет слишком сильным.Идея состоит в том, что вы можете свободно изменять реализацию своего класса и использовать свои тесты, чтобы убедиться, что он все еще работает правильно.Вы не сможете сделать это, если ваши тесты проверяют внутреннее состояние или поток.

У вас есть 2 варианта (в зависимости от контекста)

  1. Вы можете структурировать свои тесты в видечтобы они смотрели только на внешне видимое поведение
  2. Если (1) слишком сложно, рассмотрите возможность рефакторинга GetDataset2 в отдельный класс.Тогда вы сможете смоделировать его при тестировании метода GetDataset.
0 голосов
/ 20 июля 2010

Помимо использования частичной имитации с помощью Rhino Mocks, вы также можете создать класс, производный от Test, который заменяет реализацию GetDataSet2 () функцией, которая записывает этот вызов. Затем проверьте это в своем тесте.

Это запах кода, который вы делаете слишком много в одном классе.

0 голосов
/ 20 июля 2010

Некоторая информация о частичных макетах здесь . Вот некоторые фрагменты кода о том, как это сделать с RhinoMocks и Moq.

Попробуйте это:

using Rhino.Mocks;
public class TestTest {
 [Test]
 public void FooTest()
 {
   var mock = new MockRepository().PartialMock<Test>();
   mock.Expect(t => t.GetDataset2());

   mock.GetDataset((RandomBoolean)null);

 }
}
0 голосов
/ 19 июля 2010

Обычно это не так, как работает модульное тестирование с помощью имитаций.

Вас должны интересовать соавторы (которых вы заглушаете / высмеиваете) и результаты (изменения состояния в случае void методов), а не внутренняя работа тестируемой системы (несмотря на обращения к соавторам).

Это объясняется тем, что и вы не можете проводить такие типы поведенческих наблюдений (по крайней мере, не изменяя свои классы для приспособления к тестированию, выставляя закрытых членов или добавляя членов, раскрывающих состояние - не очень хорошие идеи).

...