如何在 .net Framework 4.7 上使用 Mediatr 进行集成测试?

我正在使用 Mediatr 库来注册和调用我的 RequestHandler。一切都很顺利,直到我开始阅读更多有关集成测试的内容。


编辑后请阅读


我无法调用继承自 RequesHandler 的类。


我的班级是这样的:


public class MyRequestHandler : RequestHandler<MyRequest, MyResponse>

{

  ....

}

我没有使用 Meditr异步,而是使用 .net Framework 4.7 而不是 asp.net core,因此,一切看起来都返回了我对 asp.net core 的答案。


当我构建时MyTestClass,要构建RequestHandler我必须创建一个ServiceFactory,也许这就是问题,因为我不知道如何。


 public MyClassTest()

 {

    ServiceFactory sv = null;

    _mediator = new Mediator(sv);

 }

编辑


提供更多信息


我的应用程序层中有这个处理程序


public class LogInUserByFormHandler : RequestHandler<LogInUserByFormRequest, LogInUserByFormResponse>

{

    private readonly IValidator<LogInUserByFormRequest> _validator;


    public LogInUserByFormHandler(IValidator<LogInUserByFormRequest> validator)

    {

        _validator = validator;

    }


    protected override LogInUserByFormResponse Handle(LogInUserByFormRequest request)

    {

        _validator.ValidateAndThrow(request);


        var userInfo = GetUserInfo(request);

        ValidateLogInUserByFormRules(userInfo);


        var userLoginInfo = GetValidUserLoginInfo(request);

        ValidateUserLoginInfoByFormRules(userLoginInfo);


        var sessionKey = CreateUserSessionKey(userInfo);


        var response = new LogInUserByFormResponse

        {

            UserName = request.UserName,

            SessionKey = sessionKey,

            UserId = userInfo.id_usuario

        };

        return response;

    }


    //A LOT OF CODE HERE, methods and etc

}

可以看到,它实现了 Mediatr。在我的表示层 Web 项目中,我使用 AutoFac 来注入处理程序,因此,我所做的任何请求总是由正确的方法处理。我所要做的就是打电话,如下所示:


var logInByFormRequest = new LogInUserByFormRequest

{

    UserName = viewModel.UserName,

    Password = viewModel.Password

};


var response = _mediator.Send(logInByFormRequest).Result;

这就像一个魅力。现在的问题出在测试项目上。它像演示项目一样引用应用程序。我不知道如何让 mediator.send 找到正确的方法。



慕哥9229398
浏览 137回答 1
1回答

繁华开满天机

对于这样的集成测试,您需要配置必要的依赖项。由于您已指示Autofac正在使用该容器,因此请像在生产中一样配置容器。使用容器获取中介并执行所需的测试。例如。[TestClass]public class LogInUserByForm_IntegrartionTest {    private LogInUserByFormRequest CreateRequest(string userName, string password) {        LogInUserByFormRequest request = new LogInUserByFormRequest {            UserName = userName,            Password = password        };        return request;    }    IMediator BuildMediator() {        //AutoFac        var builder = new ContainerBuilder();        builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();        var mediatrOpenTypes = new[] {            typeof(IRequestHandler<,>)        };        foreach (var mediatrOpenType in mediatrOpenTypes) {            builder                .RegisterAssemblyTypes(typeof(LogInUserByFormRequest).GetTypeInfo().Assembly)                .AsClosedTypesOf(mediatrOpenType)                .AsImplementedInterfaces();        }        builder.Register<ServiceFactory>(ctx => {            var c = ctx.Resolve<IComponentContext>();            return t => c.Resolve(t);        });        //...all other needed dependencies.        //...        var container = builder.Build();        var mediator = container.Resolve<IMediator>();        return mediator;    }    [TestMethod]    [Description("")]    public async Task UserName_ShouldHave_Max_30Characters_Exception() {        try        {            //Arrange            var request = CreateRequest("UserNameIsGreaterThanAllowed", "password");            var mediator = BuildMediator();            //Act            var response = await mediator.Send(request);            //Assert            //...assert the expected values of response.        }        catch (System.Exception ex)        {            throw;        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP