我有两节课。我想验证是否在其中一个类上调用了属性。
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 = new ClassA();
a.Foo = mockInterfaceB;
a.LoadData();
答案 0 :(得分:2)
你的问题标题要求进行集成测试,而不是单元测试,所以看起来你不应该模拟或存根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
的值。以下是我编写这些测试的方法:
注意: 我会将两个不同的值传递给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);
注意: 您根本不需要classA;您只是在classB
上测试Save()
方法的功能
// 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);
验证此方法在classA上的行为:
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);