MassTransit消费者难以测试

时间:2016-03-31 08:42:51

标签: c# .net unit-testing servicebus masstransit

我在测试MassTransit消费者方面有两个问题:

  1. 同步问题
  2. MessageData
  3. 第一个是这样的:

    var testConsumer = TestFactory.ForConsumer<ImageUploadConsumer>().New(
                    test =>
                    {
                        test.UseConsumerFactory(new InstanceConsumerFactory<ImageUploadConsumer>(ImageConsumer));                    
                        test.Publish(message, (scenario, context) =>
                        {
    
                        });                    
                    });
    
                testConsumer.Execute(); //Is non blocking
    

    以下行(如下)失败,因为这一行:

            moqFileMetaRepo.Verify(_ => _.Add(It.IsAny<IFileMeta>()),Times.Once ); 
    

    执行9.9 / 10之前......这条线曾经做过:

        public async Task Consume(ConsumeContext<ImageUploadWithThumb> context)
    

    我的修复一直是

    moqFileMetaRepo
                .Setup(repo => repo.Add(It.IsAny<IFileMeta>()))
                .Callback(() => { AutoEvent.Set(); });
    

    在断言之前调用以下内容:

    AutoEvent.WaitOne(TimeSpan.FromSeconds(10));
    

    这真的是很多工作。并且使得TDD或测试总体上很麻烦,我担心这会随着时间的推移而被忽略。

    MessageData问题是另一个问题。这是我通过

    发送的有效负载
            message = new ImageUploadWithThumb()
            {
                Id = Guid.NewGuid(),
                FileName = "Test.jpg",
                User = "Me",
                Extension = "jpg",
                OriginalImage = new ConstantMessageData<byte[]>(new Uri("https://g00gle.com"), new byte[] { 1, 2, 3 })
            };
    

    我希望在另一端获得byte[] { 1, 2, 3 },而不必诉诸于创建实际的持久性。

    相反: Got an error

    在发件人方面,MessageData.Value解析正常。消费者完全是炸弹。在prod中工作= _ =这不是测试的地方。

    我真的只想嘲笑和UnitTest我的消费者不必与框架搏斗 - 最好在5分钟左右。在坚持使用MT3的时候还有出路吗?

1 个答案:

答案 0 :(得分:1)

我建议查看MassTransit.TestFramework包。它确实需要NUnit,但你总是可以把类和它移植到你自己的测试框架。

所有MassTransit单元测试都是使用此框架中的fixture来编写的。最初的.Testing命名空间是一个受伤的世界,它并没有完全生存,我不确定它是否真的完全正常工作。它不是为异步而设计的,因此很难在不完全丢弃它的情况下进行转换。