C# Rhinomocks:我能';t正确调用assertwas
我在尝试使用Rhinomock来确定是否在测试中调用我的类中的方法时遇到了一些问题,同时也调用了一定数量的其他方法。 我要考的班级:C# Rhinomocks:我能';t正确调用assertwas,c#,.net,mocking,rhino-mocks,C#,.net,Mocking,Rhino Mocks,我在尝试使用Rhinomock来确定是否在测试中调用我的类中的方法时遇到了一些问题,同时也调用了一定数量的其他方法。 我要考的班级: public class OrderMessageHandler : IHandleMessages<UpdateOrder> { public virtual IRepository Repository { get; set; } public void Handle(UpdateOrder message) {
public class OrderMessageHandler : IHandleMessages<UpdateOrder>
{
public virtual IRepository Repository { get; set; }
public void Handle(UpdateOrder message)
{
if (!message.Order.Confirmed) return;
using (var om = new OperationManager())
{
try
{
om.BeginOperation();
LVR.Order.Model.OrderHeader order = ConvertToLocalOrderHeader(message.Order);
Repository.SaveUpdate(order);
om.CommitOperation();
}
catch (Exception ex)
{
om.RollbackOperation();
// other stuff here
}
}
}
internal virtual LVR.Order.Model.OrderHeader ConvertToLocalOrderHeader(Protocol.DTO.OrderHeader order)
{
// do stuff here, and call Repository.GetAll<Country>()
}
}
召唤
如果参数为null,该方法将引发异常。
太糟糕了,问题是它不应该重新调用该方法,但只要告诉我它以前是否从未在测试方法中调用过。
这里怎么了
编辑:
根据评论中收到的建议,我尝试了不同的方法(考虑到我不喜欢expect/verify的味道)。以下是测试方法:
[Fact]
public void ConvertToLocalOrderHeader_GivenConfirmedOrderMessage_CallTheConversionMethods2()
{
var mocks = new MockRepository();
var sut = mocks.PartialMock<OrderMessageHandler>();
sut.Repository = mocks.Stub<IRepository>();
sut.Repository.Stub(r => r.GetAll<Country>())
.Return(
new List<Country>
{
new Country {CountryID = "IT", Description = "Italy"},
new Country {CountryID = "US", Description = "United States"}
}.AsQueryable()
);
sut.Repository.Stub(r => r.SaveUpdate<OrderHeader>(Arg<OrderHeader>.Is.Anything));
Expect.Call(() => sut.Handle(Arg<UpdateOrder>.Is.Anything));
sut.Replay();
sut.Handle(new UpdateOrder
{
Order = order,
EventId = new Guid(),
EventTime = DateTime.Now
});
mocks.VerifyAll();
}
该错误由代码行引发
Expect.Call(() => sut.Handle(Arg<UpdateOrder>.Is.Anything));
Expect.Call(()=>sut.Handle(Arg.Is.Anything));
所以,即使采用这种方法也没有运气
还有其他想法吗?我发现了问题所在:方法
ConvertToLocalOrderHeader
至少应该声明受保护的内部,以便Rhinomock覆盖它<代码>虚拟
是不够的,因为测试类是不同的类。
对于一个花了我几个小时才解决的问题,非常简单的解决方案://您能尝试将Handle方法虚拟化吗?我认为rhino在这种情况下无法覆盖该方法,除非你这么做。嗯,你是对的。。。太糟糕了,整体行为没有改变:我仍然有同样的问题,我认为在您的案例中使用expect,就像在这个示例中一样,鉴于我不喜欢expect/verify模式,我尝试实现您在我的上下文中指出的示例,但仍然没有成功。。请参阅编辑后的文章以了解详细信息。我建议您在一个ctor中获取IRepository,因为您希望in永远不会为空。这通常是您注入依赖项的方式。我知道这可能不合适,但这是一个更好的设计(imo)为这个类,它会解决你的问题。如果你不想这么做,就说吧,我会尝试为这个设计想出一个解决方案。
sut.Handle(null)
[Fact]
public void ConvertToLocalOrderHeader_GivenConfirmedOrderMessage_CallTheConversionMethods2()
{
var mocks = new MockRepository();
var sut = mocks.PartialMock<OrderMessageHandler>();
sut.Repository = mocks.Stub<IRepository>();
sut.Repository.Stub(r => r.GetAll<Country>())
.Return(
new List<Country>
{
new Country {CountryID = "IT", Description = "Italy"},
new Country {CountryID = "US", Description = "United States"}
}.AsQueryable()
);
sut.Repository.Stub(r => r.SaveUpdate<OrderHeader>(Arg<OrderHeader>.Is.Anything));
Expect.Call(() => sut.Handle(Arg<UpdateOrder>.Is.Anything));
sut.Replay();
sut.Handle(new UpdateOrder
{
Order = order,
EventId = new Guid(),
EventTime = DateTime.Now
});
mocks.VerifyAll();
}
System.InvalidOperationException
Previous method 'OrderMessageHandler.get_Repository();' requires a return value or an exception to throw.
Expect.Call(() => sut.Handle(Arg<UpdateOrder>.Is.Anything));