2015-08-25 39 views
1

我有这样的代码来模拟一个Rebus MessageContext的模拟卤面消息上下文的需要交易

IBus fakeBus; 
    IMessageContext messageContext; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     fakeBus = new FakeBus(); 
     var mock = new Mock<IMessageContext>(); 
     mock.Setup(m => m.ReturnAddress).Returns("queuename"); 
     mock.Setup(h => h.Headers).Returns(new Dictionary<string, object>()); 
     mock.Setup(m => m.Items).Returns(new Dictionary<string, object>()); 
     mock.Setup(m => m.RebusTransportMessageId).Returns(Guid.NewGuid().ToString()); 

     messageContext = mock.Object; 

     var fakeContext = FakeMessageContext.Establish(messageContext); // error here 
    } 

但最后一行返回下面的堆栈跟踪。我在这里错过了什么?

旁注:我仍在使用Rebus 0.84。

结果堆栈跟踪:

at Rebus.MessageContext.Establish(IMessageContext messageContext, Boolean overwrite) 
    at Rebus.Testing.FakeMessageContext.Establish(IMessageContext messageContext) 
    at MyApp.Messaging.Tests.Handlers.RegisterPaymentCallbackTests.TestInitialize() in C:\CUT.Tests\Handlers\RegisterPaymentCallbackTests.cs:line 57 
Result Message: Initialization method MyApp.Tests.Handlers.RegisterPaymentCallbackTests.TestInitialize threw exception. System.InvalidOperationException: Could not find a transaction context. There should always be a transaction context - though it might be a NoTransaction transaction context.. 

回答

0

我还没有真正使用的假消息上下文自己,因为我通常发现很容易要么使用SagaFixture还是稍微大一点单位的我的单元测试。

当我看着老卤面代码,我可以看到,所有行使FakeMessageContext测试先建立一个事务上下文,像这样:

using (TransactionContext.None()) using (FakeMessageContext.Establish(fakeContext)) { // do stuff }

这样就必须要做到这一点: )

+0

没有“.None()”方法。但我想这样做会和Rebus.Bus.TransactionContext.Set(new Rebus.Bus.NoTransaction())一样。 – dampee

+0

@dampee你是否得到这个工作?我也使用0.84,但.None()是内部的,所以我不能使用。好奇你的解决方案 – Steven