为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕哥9229398 2023-08-20 14:55:48
我正在使用 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 找到正确的方法。
查看完整描述

1 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

对于这样的集成测试,您需要配置必要的依赖项。由于您已指示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;

        }

    }

}

查看完整回答
反对 回复 2023-08-20
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信