【问题标题】:Test MassTransit state machine saga activity测试 MassTransit 状态机 saga 活动
【发布时间】:2021-05-10 09:35:54
【问题描述】:

我正在尝试对我的 MassTransit 状态机传奇的自定义 Activity 进行单元测试。

看起来像这样:

public class UpdateActivity : Activity<UpdateState>
{
    private readonly ConsumeContext _consumeContext;
    private readonly ILogger<UpdateActivity> _logger;

    public UpdateActivity(
        ConsumeContext consumeContext,
        ILogger<UpdateActivity> logger
    )
    {
        _consumeContext = consumeContext;
        _logger = logger;
    }

    public void Probe(ProbeContext context) => context.CreateScope(nameof(UpdateActivity));

    public void Accept(StateMachineVisitor visitor) => visitor.Visit(this);

    public async Task Execute(BehaviorContext<UpdateState> context, Behavior<UpdateState> next)
    {
        await DoStuffAsync(context.Instance);
        await next.Execute(context).ConfigureAwait(false);
    }

    public async Task Execute<T>(BehaviorContext<UpdateState, T> context, Behavior<UpdateState, T> next)
    {
        await DoStuffAsync(context.Instance);
        await next.Execute(context).ConfigureAwait(false);
    }

    public Task Faulted<TException>(BehaviorExceptionContext<UpdateState, TException> context, Behavior<UpdateState> next) where TException : Exception
        => next.Faulted(context);

    public Task Faulted<T, TException>(BehaviorExceptionContext<UpdateState, T, TException> context, Behavior<UpdateState, T> next) where TException : Exception
        => next.Faulted(context);
}

我想不通的是,在为此类编写单元测试时,如何模拟/伪造对 ConsumeContext 的期望。我尝试使用InMemoryTestHarness 查找内容,但找不到合适的内容。

编辑:

我不妨把这个也扔进去。如何模拟 context 或在测试工具中运行它?这样我也可以对这个 Activity 进行单元测试吗?

    public class UpdateActivity : Activity<UpdateState, IDataUpdatedEvent>
    {
        private readonly ILogger<UpdateActivity> _logger;

        public UpdateActivity(
            ILogger<UpdateActivity > logger
        )
        {
            _logger = logger;
        }

        public void Probe(ProbeContext context) => context.CreateScope(nameof(UpdateActivity));

        public void Accept(StateMachineVisitor visitor) => visitor.Visit(this);

        public async Task Execute(BehaviorContext<UpdateState, IDataUpdatedEvent> context, Behavior<UpdateState, IDataUpdatedEvent> next)
        {

【问题讨论】:

    标签: masstransit automatonymous


    【解决方案1】:

    MassTransit 有 test harnesses 允许测试状态机以及使用依赖注入的活动。

    鉴于这些工具的可用性,“使用模拟进行隔离测试”的想法相当没有意义。

    【讨论】:

    • 感谢您的快速回复!我一直在看,但我就是不知道如何单独测试 Activity?我已经使用测试工具为整个 saga 设置了测试,但是我有一些逻辑复杂的活动,在测试中只使用 new Activity() 会很好,并根据多个不同的输入进行断言。
    • 我没有提供任何方法来单独测试一个活动,我不确定它会提供什么价值,与在状态机上下文中测试它相比似乎过度。
    • 好的!那我至少知道。谢谢!我想我可以操纵状态机的状态来获得我想要的活动级别的测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多