C# Rhinomocks:我能';t正确调用assertwas

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) {

我在尝试使用Rhinomock来确定是否在测试中调用我的类中的方法时遇到了一些问题,同时也调用了一定数量的其他方法。 我要考的班级:

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));