首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于MassTransit的测试活动补偿

基于MassTransit的测试活动补偿
EN

Stack Overflow用户
提问于 2020-06-09 20:03:14
回答 1查看 396关注 0票数 1

我试图在我的活动中测试补偿逻辑,但我不知道如何在测试中启动Compensate方法。如果在DB中找不到什么东西,我有一个活动应该抛出一个异常。在这种情况下,我已经想出了如何确保故障中的活动,但我找不出补偿部分。

我的考试课在下面。注意,等待RoutingSlipActivityCompensated处理程序会抛出一个TaskCanceledException。如何测试活动的补偿部分?

代码语言:javascript
复制
[TestClass]
public class DisableTeamCheckInsActivityTests
{
   Mock<ILogger<DisableTeamCheckInsActivity>> _logger;
   CheckInsDbContext _db;

   InMemoryTestHarness _harness;
   ActivityTestHarness<DisableTeamCheckInsActivity, DisableTeamCheckIns, DisableTeamCheckInsLog> _activity;

   [TestInitialize]
   public async Task Initialize()
   {
      _logger = new Mock<ILogger<DisableTeamCheckInsActivity>>();
      _db = CheckInDbContextFactory.Create();

      _harness = new InMemoryTestHarness
      {
         TestTimeout = TimeSpan.FromSeconds(5)
      };

      _activity = _harness.Activity<DisableTeamCheckInsActivity, DisableTeamCheckIns, DisableTeamCheckInsLog>(
         _ => new DisableTeamCheckInsActivity(_logger.Object, _db),
         _ => new DisableTeamCheckInsActivity(_logger.Object, _db)
      );

      await _db.Database.EnsureCreatedAsync();
      await _harness.Start();
   }

   [TestCleanup]
   public async Task Cleanup()
   {
      await _db.Database.EnsureDeletedAsync();
      await _harness.Stop();
   }

   [TestMethod]
   public async Task Missing_Team_Throws()
   {
      var teamId = Guid.NewGuid();

      var builder = new RoutingSlipBuilder(Guid.NewGuid());
      builder.AddSubscription(_harness.BusAddress, RoutingSlipEvents.All);

      var faulted = _harness.SubscribeHandler<RoutingSlipActivityFaulted>();
      var compensated = _harness.SubscribeHandler<RoutingSlipActivityCompensated>();

      builder.AddActivity(_activity.Name, _activity.ExecuteAddress, new
      {
         TeamId = teamId
      });

      await _harness.Bus.Execute(builder.Build());

      var faultContext = await faulted;
      Assert.AreEqual("System.InvalidOperationException", faultContext?.Message?.ExceptionInfo?.ExceptionType);

      await compensated; // <-- This throws a TaskCanceledException
   }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-10 14:18:46

一个单一活动的路由选择将永远无法弥补。如果是活动故障,则是路由滑动故障,但是由于没有任何以前的活动,所以在路由选择中没有任何补偿信息。

如果活动完成,而随后的活动出现故障,则将调用compensate方法,并发布ActivityCompensated事件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62290941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档