Пример интеграционного теста с Rhino Mocks - PullRequest
0 голосов
/ 08 апреля 2010

У меня есть два класса. Я хотел бы убедиться, что свойства вызываются в одном из классов.

public classA  
{  
    public IBInterface Foo {get;set;}  
    public LoadData()    
    {  
      Foo.Save(1.23456, 1.23456);  
    }  
}  

public classB : IBInterface   
{  
    public decimal ApplePrice {get; set;}    
    public decimal OrangePrice {get;  set;}    

    public void Save(decimal param1, decimal param2)  
    {  
        this.ApplePrice = param1;  
        this.OrangePrice = param2;  
    }
}  

Я хотел бы использовать Rhino Mocks (синтаксис AAA) для проверки правильности установки ApplePrice и OrangePrice.

Полагаю, мне следует начать так, но как проверить, что ApplePrice и OrangePrice были установлены?

var mockInterfaceB = mockery.DynamicMock ();
ClassA a = новый ClassA ();
a.Foo = mockInterfaceB;
a.LoadData ();

1 Ответ

2 голосов
/ 08 апреля 2010

В заголовке вашего вопроса запрашивается интеграционный тест , а не модульный тест, так что, похоже, вам не следует издеваться или заглушать classB, потому что большая часть того, что вы пытаетесь проверить, это поведение именно этого класса. Заглушка это победит эту цель; RhinoMocks здесь не место.

// arrange
var expected = 1.23456;
var class_b = new classB();
var class_a = new classA{ Foo = class_b };

// act
a.LoadData();

// assert
Assert.AreEqual(expected, class_b.ApplePrice);
Assert.AreEqual(expected, class_b.OrangePrice);

Если то, что вы действительно хотите, является модульным тестом, тогда ваша первая задача - определить единицу функциональности, которую вы тестируете.

Из вашего описания звучит так, будто вы хотите проверить две разные вещи:

  1. что звонит LoadData() звонит Save(1.23456, 1.23456)
  2. при вызове Save(...) устанавливаются значения свойств ApplePrice и OrangePrice.

Вот как я бы написал эти тесты:

1

примечание: Я бы передал два разных значения методу Save(), чтобы убедиться, что правильный параметр присваивается правильному свойству

 // arrange
 var expected_apple = 1.23456m;
 var expected_orange = 6.54321m;

 var b_mock = MockRepository.GenerateStub<IBInterface>();
 b_mock.Stub(x => x.Save(Arg<decimal>.Is.Anything, Arg<decimal>.Is.Anything))
 .WhenCalled(x =>
 {
    b_mock.ApplePrice = (decimal) x.Arguments[0];
    b_mock.OrangePrice = (decimal) x.Arguments[1];
 });

 var sut = new classA{ Foo = b_mock };

 // act
 sut.LoadData();

 // assert
 b_mock.AssertWasCalled(x => x.Save(expected_apple, expected_orange),
    options => options.Repeat.Once());
 Assert.AreEqual(expected_apple, b_mock.ApplePrice);
 Assert.AreEqual(expected_orange, b_mock.OrangePrice);

2

примечание: вам вообще не нужен класс A здесь; вы только тестируете функциональность метода Save() в классе B

// arrange
var apple = 1.23456m;
var orange = 6.54321m;

var sut = new classB();

// act
sut.Save(apple, orange);

// assert
Assert.AreEqual(apple, sut.ApplePrice);
Assert.AreEqual(orange, sut.OrangePrice);

изменить в ответ на комментарий:

Чтобы проверить поведение этого метода в классе A:

LoadData() { Foo.ApplePrice = -1; Foo.OrangePrice = -2; }

тест:

// arrange
var apple = -1m;
var orange = -2m;

var stub_b = MockRepository.GenerateStub<classB>();
var sut = new classA{ Foo = stub_b };

// act
sut.LoadData();

// assert
Assert.AreEqual(apple, stub_b.ApplePrice);
Assert.AreEqual(orange, stub_b.OrangePrice);
...