2010-07-12 6 views
14

Tôi là người mới chế nhạo và tôi đang gặp khó khăn trong việc giải quyết vấn đề với UnitTesting.Tôi có thể sử dụng Rhino Mocks như thế nào để kiểm tra xem giá trị nào đã được chuyển đến phương thức

Nói rằng tôi có mã này:

public class myClass{ 

    private IDoStuff _doer; 

    public myClass(IDoStuff doer){ 
     _doer = doer; 
    } 

    public void Go(SomeClass object){ 

     //do some crazy stuff to the object 

     _doer.DoStuff(object) //this method is void too 
    } 
} 

Ok, vì vậy tôi muốn thử nghiệm UNIT phương pháp Go. Tôi không quan tâm đối tượng _doer làm gì với đối tượng một lần là lấy nó.

BAO GIỜ, tôi muốn kiểm tra xem đối tượng _doer đã nhận được gì.

trong mã giả tôi muốn đạt được điều này:

[Test] 
public void MyTest() 
{ 
    IDoStuff doer = Mocker.Mock<IDoStuff>(); 
    Guid id = Guid.NewGuid(); 

    //test Go method 
    new MyClass(doer).Go(new SomeClass(){id = id}); 

    Assert.AreEqual(id,MockingFramework.Method(DoStuff).GetReceived<SomeClass>().id); 
} 

Đây có phải là có thể sử dụng Rhino, và nếu như vậy, làm thế nào để đạt được điều đó?

cổ vũ

Trả lời

21

với sự mới cú pháp Sắp xếp/Luật/Khẳng định:

[Test] 
public void MyTest() 
{ 
    // arrange 
    IDoStuff doer = MockRepository.GenerateStub<IDoStuff>(); 
    MyClass myClass = new Myclass(doer); 
    Guid id = Guid.NewGuid(); 

    // act 
    myClass.Go(new SomeClass(){id = id}); 

    // assert 
    doer.AssertWasCalled(x => x.DoStuff(
     Arg<Someclass>.Matches(y => y.id == id))); 
} 
4

Tôi nghĩ rằng những gì bạn có là tốt vì vậy nó sẽ là:

IDoStuff doer = MockRepository.GenerateMock<IDoStuff>(); 

sau đó thiết lập kỳ vọng qua:

doer.Expect(() => DoStuff(id)); 

sau đó ở cuối:

doer.VerifyAllExpectations(); 

CHỈNH SỬA từ Lee's câu trả lời cho lưu ý rằng bạn cũng có thể làm công cụ như:

doer.Expect(d => d.DoStuff(Arg<int>.Is.GreaterThan(5)) 

hoặc

doer.Expect(d => d.DoStuff(Arg<CustomObject>.Matches(x => x.CustomProperty == "Beef"))); 

hoặc kiểm tra tương tự như khi bạn không muốn so sánh tài liệu tham khảo chính xác bằng cách sử dụng các đối tượng Arg và Arg.

1

Nếu bạn chỉ muốn kiểm tra xem dụ MyClass qua tham số của nó để doer.Go sau đó bạn chỉ có thể thiết lập một kỳ vọng:

SomeClass obj = new SomeClass { id = id }; 

doer.Expect(d => d.DoStuff(obj)); 

//test go method 
new MyClass(doer).Go(obj); 

doer.VerifyAllExpectations(); 

Tuy nhiên nếu bạn muốn kiểm tra xem nó đi một số đối tượng có thể khác nhau với một số giá trị đặc biệt đối với một tài sản, sau đó bạn có thể sử dụng một hạn chế:

doer.Expect(d => d.DoStuff(null)) 
    .IgnoreArguments() 
    .Constraints(Property.Value("Id", expectedId)); 
7

Tất cả các câu trả lời này cung cấp nhiều cách khác nhau để thực hiện những gì bạn muốn và tất cả chúng hoạt động. Có một điều bổ sung cần lưu ý. Nếu bạn cần để có được thực sự "cấp thấp" và kiểm tra các đối số thông qua bất kỳ phương pháp stubbed/mocked, bạn có thể sử dụng GetArgumentsForCallsMadeOn.

Hơi lộn xộn một chút khi nó trả về đối tượng [] []. Bạn sử dụng nó như thế này (giả sử bạn stubbed stubber.InsertData chấp nhận null):

var args = stubber.GetArgumentsForCallsMadeOn(s => s.InsertData(null)); 

args [0] là một mảng các tham số truyền cho InsertData lần đầu tiên nó được gọi.

args [1] là một mảng tham số được truyền tới InsertData lần thứ hai nó được gọi.

vv ...

Vì vậy, nếu bạn muốn nhìn thấy giá trị số nguyên truyền như tham số thứ hai của sự thỉnh nguyện đầu tiên của một số phương pháp bạn có thể:

var check = (int) args[0][1]; 

Một lần nữa, tôi khuyên bạn nên một của các phương pháp trước đó, nhưng điều này có sẵn nếu bạn cần phải thực sự xuống và bẩn để kiểm tra các đối số.

3

Chỉ có một đề nghị:

cả giải pháp từ Wim CoenenPatrick Steele là chính xác nhưng, đối với giải pháp đầu tiên, rất nhanh khi chỉ có một tham số, có một thông báo lỗi không chính xác khi thử nghiệm thất bại.

Đây là một thông điệp cho chức năng của tôi với hai tham số:

IProductChecker.MustPublish (bằng 2, bằng 123X); Dự kiến ​​# 1, Thực tế # 0.

Bây giờ, thông số nào trong hai tham số sai? Và nếu các tham số có nhiều hơn thì sao?

Tôi đã chuẩn bị thử nghiệm với mã này:

//ARRANGE 
const string CLASSCODE = "ABC"; 
const string SUBCLASSCODE = "123X"; 
var expected = new [] {CLASSCODE, SUBCLASSCODE}; 

//ACT 
SUT.CallMyFunction(chkMock); 
var actual = chkMock.GetArgumentsForCallsMadeOn(m => m.MustPublish(null, null))[0]; 

//Assert 
CollectionAssert.AreEqual(expected, actual); 
//instead of 
//chkMock.AssertWasCalled(m => m.MustPublish(Arg<string>.Is.Equal("2"), Arg<string>.Is.Equal(SUBCLASSCODE))); 

Vì vậy, trong trường hợp này được thông báo là:

CollectionAssert.AreEqual thất bại. (Phần tử tại chỉ mục 0 không khớp.)

Hi