2016-03-15 151 views
1

我在卤面这个简单之城:单元测试问题

public void MySaga : Saga<MySagaData> 
    IAmInitiatedBy<Event1> 
    IHandleMessages<Event2> 
{ 
     private IBus bus; 
     private ILog logger; 

     public MySaga(IBus bus, ILog logger) 
     { 
      if (bus == null) throw new ArgumentNullException("bus"); 
      if (logger == null) throw new ArgumentNullException("logger"); 

      this.bus = bus; 
      this.logger = logger; 
     } 

     protected override void CorrelateMessages(ICorrelationConfig<MySagaData> config) 
     { 

      config.Correlate<Event>(m => m.MyObjectId.Id, s => s.Id); 
      config.Correlate<Event>(m => m.MyObjectId.Id, s => s.Id); 
     } 

    public Task Handle(Event1 message) 
    { 
     return Task.Run(() => 
     { 
      this.Data.Id = message.MyObjectId.Id; 
      this.Data.State = MyEnumSagaData.Step1; 
      var cmd = new ResponseCommandToEvent1(message.MyObjectId); 
      bus.Send(cmd); 
     }); 
    } 

    public Task Handle(Event2 message) 
    { 
     return Task.Run(() => 
     { 
      this.Data.State = MyEnumSagaData.Step2; 
      var cmd = new ResponseCommandToEvent2(message.MyObjectId); 
      bus.Send(cmd); 
     }); 
    } 
} 

多亏了那种mookid8000我可以用FakeBus和SagaFixture测试传奇:

[TestInitialize] 
public void TestInitialize() 
{ 
    var log = new Mock<ILog>(); 
    bus = new FakeBus(); 
    fixture = SagaFixture.For<MySaga>(() => new MySaga(bus, log.Object)); 
    idTest = new MyObjectId(Guid.Parse("1B2E7286-97E5-4978-B5B0-D288D71AD670")); 
} 

[TestMethod] 
public void TestIAmInitiatedBy() 
{ 
    evt = new Event1(idTest); 
    fixture.Deliver(evt); 
    var testableFixture = fixture.Data.OfType<MySagaData>().First(); 
    Assert.AreEqual(MyEnumSagaData.Step1, testableFixture.State); 
    // ... more asserts 
} 

[TestMethod] 
public void TestIHandleMessages() 
{ 
    evt = new Event2(idTest); 
    fixture.Deliver(evt); 
    var testableFixture = fixture.Data.OfType<MySagaData>().First(); 
    Assert.AreEqual(MyEnumSagaData.Step2, testableFixture.State); 
    // ... more asserts 
} 

[TestCleanup] 
public void TestCleanup() 
{ 
    fixture.Dispose(); 
    bus.Dispose(); 
} 

检查IAmInitiatedBy的第一个测试方法已正确执行且未引发错误,而第二个测试失败。它看起来像是一个相关性问题,因为fixture.Data不包含任何元素,并且在fixture.LogEvents中包含最后一个元素:找不到消息Event2/b91d161b-eb1b-419d-9576-2c13cd9d9c51的现有传奇数据。

这是什么GUID?与我在单元测试中定义的完全不同吗?有任何想法吗?我尝试测试是否合法(因为我使用的是内存总线)?

回答

1

这条线路不好:this.Data.Id = message.MyObjectId.Id。如果您在覆盖它之前检查了Data.Id的值,则会注意到该属性已具有值。

你不分配传奇ID - Rebus这样做。你应该独自离开这个属性:)

关于你的错误 - 当卤面希望记录有关特定消息的信息,它记录的类型和消息ID一个简短的名称,即自动调整广告,价值分配了rbs2-msg-id标题。换句话说:这不是属性m.MyObjectId.Id的值,你看,它是消息ID。

由于每次测试运行都会重新初始化事件夹具,并且您只向其发送一个Event2(不允许启动新实例),因此该事件不会被触发。

+0

我没有分配佐贺ID,因为这发生在相关阶段,这就是为什么即使删除坏行的传奇ID仍然等于'message.MyObjectId.Id'。我对吗?对于第二点,我用'[ClassInitialize]'替换了'[TestInitialize]',它现在可以工作。再次感谢你... –