簡體   English   中英

NET Framework 4.7上如何使用Mediatr進行集成測試?

[英]How to do Integration Tests with Mediatr on .net framework 4.7?

我正在使用Mediatr庫注冊並調用我的RequestHandlers。 一切順利,直到我開始閱讀有關集成測試的更多信息。

編輯后請紅色

我無法調用從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;

這就像一個魅力。 現在的問題是在Test項目上。 它像Presentation Project一樣引用該應用程序。 我不知道如何使mediator.send找到正確的方法。

編輯²

這是我的測試代碼

[TestClass]
public class LogInUserByFormTest 
{
    private LogInUserByFormRequest CreateRequest(string userName, string password)
    {
        LogInUserByFormRequest request = new LogInUserByFormRequest
        {
            UserName = userName,
            Password = password
        };

        return request;
    }

    [TestMethod]
    [Description("")]
    public void UserName_ShouldHave_Max_30Characters_Exception()
    {
        try
        {
            var request = CreateRequest("UserNameIsGreaterThanAllowed", "password");
            var mediator = new Mock<IMediator>();
            var response = mediator.Object.Send(request).Result;
        }
        catch (System.Exception ex)
        {

            throw;
        }
    }
}

結果(響應)始終為null,並且調解器未調用正確的處理程序。

編輯3

這是我注冊處理程序和驗證程序的方式。 我使用autofac。 此類在global.asax上被調用

 public class AutofacConfig
{
    public static void ConfigureContainer()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(Assembly.GetExecutingAssembly()).InstancePerRequest();
        builder.RegisterType<Mediator>().As<IMediator>().InstancePerLifetimeScope();
        builder.RegisterType<AutofacValidatorFactory>().As<IValidatorFactory>().SingleInstance();
        builder.RegisterType<FluentValidationModelValidatorProvider>().As<ModelValidatorProvider>();
        builder.RegisterType<RegistryManagerService>().As<IRegistryManagerService>().SingleInstance().WithParameter("appName", ConfigurationManager.AppSettings["APPNAME"]);

        builder.Register<ServiceFactory>(context =>
        {
            var c = context.Resolve<IComponentContext>();
            return t => c.Resolve(t);
        });

        builder.RegisterAssemblyTypes(Assembly.Load("Docspider.Application"))
            .Where(x => x.Name.EndsWith("Handler"))
            .AsImplementedInterfaces();

        builder.RegisterAssemblyTypes(Assembly.Load("Docspider.Application"))
           .Where(x => x.Name.EndsWith("Validator"))
           .AsImplementedInterfaces()
           .InstancePerLifetimeScope();

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

public class AutofacValidatorFactory : ValidatorFactoryBase
{
    private readonly IComponentContext _context;

    public AutofacValidatorFactory(IComponentContext context)
    {
        _context = context;
    }

    public override IValidator CreateInstance(Type validatorType)
    {
        if (_context.TryResolve(validatorType, out object instance))
        {
            var validator = instance as IValidator;
            return validator;
        }

        return null;
    }
}

對於這種集成測試,您將需要配置必要的依賴關系。 由於您已指示正在使用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;
        }
    }
}

上面是根據MediatR.Examples.Autofac提供的示例建模的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM