我试图在我的活动中测试补偿逻辑,但我不知道如何在测试中启动Compensate方法。如果在DB中找不到什么东西,我有一个活动应该抛出一个异常。在这种情况下,我已经想出了如何确保故障中的活动,但我找不出补偿部分。
我的考试课在下面。注意,等待RoutingSlipActivityCompensated处理程序会抛出一个TaskCanceledException。如何测试活动的补偿部分?
[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
}
}发布于 2020-06-10 14:18:46
一个单一活动的路由选择将永远无法弥补。如果是活动故障,则是路由滑动故障,但是由于没有任何以前的活动,所以在路由选择中没有任何补偿信息。
如果活动完成,而随后的活动出现故障,则将调用compensate方法,并发布ActivityCompensated事件。
https://stackoverflow.com/questions/62290941
复制相似问题