犀牛非原始对象在期望中

本文关键字:期望中 对象 原始 犀牛 | 更新日期: 2023-09-27 18:34:31

似乎注释无法支持代码

假设我调用了一个方法(例如SaveTicket(并使用构造函数(例如存储库,日志记录(来注入各种模拟接口。如果该方法调用另一个对象并在该方法中创建非基元对象。有没有简单的方法来测试该非原始对象的值?

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

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

以正确的值 t I 可以调用

  1. Do lastcall.constraint

  2. lastcall.ignorearguments

有没有更好的方法?

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

犀牛非原始对象在期望中

让我们举个例子。假设您有以下类,并且想要对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
            )
        )
    );
}

您应该只测试在模拟依赖项(存储库、日志记录(上调用了哪些方法。验证从模拟返回的对象不会给您任何好处(因为您验证了刚刚手动创建的内容并设置为返回结果(。