Rhinomock非原始对象的期望

时间:2012-05-16 07:54:57

标签: c# unit-testing mocking rhino-mocks

似乎评论无法支持代码

让我说我调用一个方法(例如SaveTicket)并使用构造函数(例如Repository,Logging)来注入各种模拟接口。如果该方法调用另一个对象并在该方法中创建非基本对象。有没有简单的方法来测试那个非原始对象的值?

我想尝试用属性替换那个非原始对象并注入是可能的,或者使用LastCall.Constraints。还有更好的方法吗?

这是一个例子 - 在下面的例子中 - 为了验证    Repository.save(T);

使用正确的值来调用

  1. 做lastcall.constraints

  2. lastcall.ignorearguments

  3. 有更好的方法吗?

    CreateMyTicket(int ticketnumber, string name)
    {
       ticketobject t = new ticketObject(ticketnumber, name);
       t.upgrade = ticketnumber+2;
       Repository.save(t);
    }
    

2 个答案:

答案 0 :(得分:3)

我们举一个例子。假设您有以下类,并且希望对CreateMyTicket方法进行单元测试:

public class ClassToTest
{
    public IRepository Repository { get; private set; }

    public ClassToTest(IRepository repository)
    {
        Repository = repository;
    }

    public void CreateMyTicket(int ticketnumber, string name)
    {
        var t = new TicketObject(ticketnumber, name);
        t.Upgrade = ticketnumber + 2;
        Repository.Save(t);
    }
}

这假设我们有一个IRepository接口:

public interface IRepository
{
    void Save(TicketObject t);
}

以下是样本单元测试的样子:

[TestMethod]
public void CreateMyTicketTest() 
{
    // arrange
    var repositoryStub = MockRepository.GenerateStub<IRepository>();
    var sut = new ClassToTest(repositoryStub);
    var ticketNumber = 5;
    var name = "John";

    // act
    sut.CreateMyTicket(ticketNumber, name);

    // assert
    repositoryStub.AssertWasCalled(
        x => x.Save(
            Arg<TicketObject>.Matches(t => 
                t.Upgrade == 7 && 
                t.Name == name && 
                t.TicketNumber == ticketNumber
            )
        )
    );
}

答案 1 :(得分:0)

您应该只测试在模拟依赖项(Repository,Logging)上调用哪些方法。验证从模拟返回的对象不会给你任何东西(因为你验证了你刚刚手动创建的内容并设置为返回结果)。