似乎评论无法支持代码
让我说我调用一个方法(例如SaveTicket)并使用构造函数(例如Repository,Logging)来注入各种模拟接口。如果该方法调用另一个对象并在该方法中创建非基本对象。有没有简单的方法来测试那个非原始对象的值?
我想尝试用属性替换那个非原始对象并注入是可能的,或者使用LastCall.Constraints。还有更好的方法吗?
这是一个例子 - 在下面的例子中 - 为了验证 Repository.save(T);
使用正确的值来调用
做lastcall.constraints
lastcall.ignorearguments
有更好的方法吗?
CreateMyTicket(int ticketnumber, string name)
{
ticketobject t = new ticketObject(ticketnumber, name);
t.upgrade = ticketnumber+2;
Repository.save(t);
}
答案 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)上调用哪些方法。验证从模拟返回的对象不会给你任何东西(因为你验证了你刚刚手动创建的内容并设置为返回结果)。