2

看来评论不能支持代码

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

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

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

用正确的 t 值调用我可以

  1. 做 lastcall.constraints

  2. lastcall.ignorarguments

有没有更好的办法?

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

2 回答 2

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
            )
        )
    );
}
于 2012-05-16T09:27:26.423 回答
0

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

于 2012-05-16T08:02:10.833 回答