В заголовке вашего вопроса запрашивается интеграционный тест , а не модульный тест, так что, похоже, вам не следует издеваться или заглушать 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);
Если то, что вы действительно хотите, является модульным тестом, тогда ваша первая задача - определить единицу функциональности, которую вы тестируете.
Из вашего описания звучит так, будто вы хотите проверить две разные вещи:
- что звонит
LoadData()
звонит Save(1.23456, 1.23456)
- при вызове
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);