首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rhino Mocks集成测试示例

Rhino Mocks集成测试示例
EN

Stack Overflow用户
提问于 2010-04-08 13:34:41
回答 1查看 1.7K关注 0票数 0

我有两堂课。我想验证这些属性是否在其中一个类上被调用。

代码语言:javascript
复制
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();

EN

回答 1

Stack Overflow用户

发布于 2010-04-08 14:58:12

您的问题标题要求的是集成测试,而不是单元测试,因此您似乎不应该模拟或存根classB,因为您要验证的很大一部分是该类的行为。坚持下去会挫败这个目的;RhinoMocks在这里没有立足之地。

代码语言:javascript
复制
// 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)

  • that的
  1. 调用Save(...)设置属性ApplePriceSave(...)的值

下面是我如何编写这些测试的方法:

1

注意:I将向Save()方法传递两个不同的值,以确保将正确的参数分配给正确的属性

代码语言:javascript
复制
 // 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()方法的功能

代码语言:javascript
复制
// 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上验证此方法的行为:

代码语言:javascript
复制
LoadData() { Foo.ApplePrice = -1; Foo.OrangePrice = -2; }

测试:

代码语言:javascript
复制
// 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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2600235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档