Как создать юнит-тесты для NServiceBus Saga? - PullRequest
5 голосов
/ 10 февраля 2011

Я пытаюсь следовать этой статье (http://blog.zoolutions.se/post/2010/04/01/Conquering-NServiceBus-part-4-e28093-Testing.aspx), чтобы создать модульный тест для моего проекта саги nservicebus

См. Следующий код, не уверен, почему он всегда жалуется Кто-нибудь знает, как я могу это исправить?

(я использую nservice bus 2.0)

public class ReportSaga : Saga<ReportSagaData>,
                          IAmStartedByMessages<RequestReportMessage>,
                          IHandleMessages<PollingReportStatusMessage>
{
// implementation
}



[TestFixture]
    public class ReportSaga_HandleRequestReportMessageTests
    {
        [TestFixtureSetUp]
        public void SetUp()
        {
            var assemblies = new[]
                         {
                             typeof (ReportSaga).Assembly,
                             typeof (RequestReportMessage).Assembly,
                             typeof (PollingReportStatusMessage).Assembly,
                             Assembly.Load("NServiceBus"),
                             Assembly.Load("NServiceBus.Core")
                         };

            Test.Initialize(assemblies);
        }

        [Test]
        public void HandleRequestReportMessageTests()
        {

            Test.Handler<ReportSaga>()
                .OnMessage<RequestReportMessage>(x =>
                {
                    x.Id = 1234;
                    x.ReportDate = DateTime.Now;
                });


        }
    }


Test 'UnitTests.ReportSaga_HandleRequestReportMessageTests.HandleRequestReportMessageTests' failed: System.ArgumentException : GenericArguments[0], 'ReportSagaData', on 'NServiceBus.IMessageHandler`1[T]' violates the constraint of type 'T'.
  ----> System.TypeLoadException : GenericArguments[0], 'ReportSagaData', on 'NServiceBus.IMessageHandler`1[T]' violates the constraint of type parameter 'T'.
    at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
    at System.RuntimeType.MakeGenericType(Type[] instantiation)
    at NServiceBus.Testing.Test.Handler[T](T handler)
    at NServiceBus.Testing.Test.Handler[T]()
    ReportSaga_HandleRequestReportMessageTests.cs(34,0): at UnitTests.ReportSaga_HandleRequestReportMessageTests.HandleRequestReportMessageTests()
    --TypeLoadException
    at System.RuntimeTypeHandle.Instantiate(RuntimeTypeHandle handle, IntPtr* pInst, Int32 numGenericArgs, ObjectHandleOnStack type)
    at System.RuntimeTypeHandle.Instantiate(Type[] inst)
    at System.RuntimeType.MakeGenericType(Type[] instantiation)

0 passed, 1 failed, 0 skipped, took 1.11 seconds (NUnit 2.5.5).

Ответы [ 3 ]

8 голосов
/ 21 февраля 2011

Точно так же, как сказал Уди, однако синтаксис должен выглядеть примерно так:

[TestFixture]
public class ReportSaga_HandleRequestReportMessageTests
{
    [TestFixtureSetUp]
    public void SetUp()
    {
        var assemblies = new[]
                     {
                         typeof (ReportSaga).Assembly,
                         typeof (RequestReportMessage).Assembly,
                         typeof (PollingReportStatusMessage).Assembly,
                         Assembly.Load("NServiceBus"),
                         Assembly.Load("NServiceBus.Core")
                     };

        Test.Initialize(assemblies);
    }

    [Test]
    public void HandleRequestReportMessageTests()
    {

        var message = new RequestReportMessage { Id = 1234, ReportDate = DateTime.Now };

        Test.Saga<ReportSaga>()
            .ExpectPublish<PublishMessage>(e => e.SomePropertyOfPublishMethod == "value")
            .When(x => x.Handle(message));

    }
}
7 голосов
/ 10 февраля 2011

Чтобы протестировать сагу, вам нужно вызвать Test.Saga, а не Test.Handler.

0 голосов
/ 04 января 2019

Здесь есть страница с некоторыми образцами => https://docs.particular.net/samples/unit-testing/

Следует 1 примеру на странице выше, с небольшими изменениями:

[Test]
public async Task ShouldProcessDiscountOrder()
{
    // Arrange
    var saga = new YourSaga
    {
        Data = new YourSagaData()
    };

    var context = new TestableMessageHandlerContext();

    var yourCommand = new MyCommandOrEvent
    {
        propA = 1
    };

    // Act
    await saga.Handle(yourCommand, context)
        .ConfigureAwait(false);

    // Assert
    var processMessage = (OutputTypeReturnedByHandle)context.SentMessages[0].Message;
    Assert.AreEqual(123, processMessage.Something);
}
...