我有两堂课。我想验证这些属性是否在其中一个类上被调用。
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 (AAA语法)来验证ApplePrice和OrangePrice设置是否正确。
我想我应该这样开始,但是如何验证ApplePrice和OrangePrice已经设置了呢?
var mockInterfaceB = mockery.DynamicMock();
ClassA a=新的ClassA();
a.Foo = mockInterfaceB;
a.LoadData();
发布于 2010-04-08 14:58:12
您的问题标题要求的是集成测试,而不是单元测试,因此您似乎不应该模拟或存根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);如果您真正想要的是一个单元测试,那么您的第一个任务就是识别您正在测试的功能单元。
根据您的描述,听起来您想测试两种不同的东西:
调用Save(1.23456, 1.23456)
Save(...)设置属性ApplePrice和Save(...)的值下面是我如何编写这些测试的方法:
1
注意:I将向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
注意:这里根本不需要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);https://stackoverflow.com/questions/2600235
复制相似问题