在补救和相关问题上对佐贺处理者进行单元测试

时间:2016-03-15 17:26:25

标签: unit-testing rebus saga

我在Rebus中有这个简单的传奇:

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 个答案:

答案 0 :(得分:1)

此行不好:this.Data.Id = message.MyObjectId.Id。如果在覆盖之前检查了Data.Id的值,您会发现该属性已经有了值。

你没有指定传奇ID - Rebus就是这么做的。你应该单独留下这个财产:)

关于您的错误 - 当Rebus想要记录有关特定邮件的信息时,它会记录该类型的短名称和邮件ID ,即自动分配的{{1}的值标头换句话说:它不是属性rbs2-msg-id的价值,您正在查看,它是消息ID。

由于每次测试运行时都会重新初始化saga fixture,并且只向它发送一个m.MyObjectId.Id(不允许启动新实例),所以saga不会被命中。