测试 MassTransit 状态机传奇活动

问题描述

我正在尝试对我用于 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,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,IDataUpdatedEvent> next)
        {

解决方法

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

考虑到这些工具的可用性,“使用模拟进行隔离测试”的想法毫无意义。