自动测试的Ninject依赖注入



上下文:

我有一个服务于多个角度应用程序的WebAPI应用程序。WebAPI应用程序使用NINEXT来促进依赖注入。我们主要在控制器的构造函数

的构造函数中使用它

目前绑定看起来像这样:

public static class NinjectWebCommon
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();
    public static void Start()
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }
    public static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
        RegisterServices(kernel);
        return kernel;
    }
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IDataContextAsync>().To<StContext>().InRequestScope();
        // FileExtensionService
        kernel.Bind<IFileExtensionService>().To<FileExtensionService>().InRequestScope();
        kernel.Bind<IFileExtensionRepository>().To<FileExtensionRepository>().InRequestScope();
        kernel.Bind<IEntityMapper<Domain.FileExtension, FileExtension>>().To<FileExtensionEntityMapper>().InRequestScope();
        // ...etc
    }
}

控制器的示例看起来像这样:

[RoutePrefix("api/fileextension")]
public class FileExtensionController : ApiController
{
    private readonly IFileExtensionService service;
    /// <summary>
    /// Initializes a new instance of the <see cref="BestandsextensieController"/> class.
    /// </summary>
    /// <param name="service">The service.</param>
    /// <exception cref="System.ArgumentNullException">service</exception>
    public FileExtensionController(IFileExtensionService service)
    {
        if (service == null)
        { 
            throw new ArgumentNullException(nameof(service));
        }
        this.service = service;
    }
    [HttpGet]
    [Route("getFileextensions")]        
    public IHttpActionResult GetFileExtensions()
    {
        return Ok(service.GetAll());
    }
}

和一个Unitiment类看起来像这样:

public class FileExtensionControllerTests
{
    private readonly Mock<IFileExtensionService> mockService;
    public FileExtensionControllerTests()
    {
        mockService = new Mock<IFileExtensionService>();
    }
    private FileExtensionController CreateSut()
    {
        return new FileExtensionController(mockService.Object);
    }
    // ... Unittests using CreateSut etc
}

问题

我想将自动测试添加到我们的连续集成触发器中。为了做到这一点,我们决定嘲笑存储库(使用欧格或刚返回假数据的自定义(。是否可以创建一个有条件的情况,其中NinjectWebCommon类注入模拟存储库,而不是真实的存储库,而当它看到它是通过自动测试调用的?

我不需要任何嘲笑的建议,而只是为了依赖注入。不过,如果您认为我做错了什么,请随时将其制作。我只是想确保设置一个清晰的范围。

在这种情况下,最佳实践是什么?我愿意改变当前的工作方式,如果您认为它们是合适的。

edit

因此,自动化测试的问题与Selenium结合使用类似。Specflow测试中指定的WebApp上按钮的实际单击。与往常一样,与手工浏览站点的唯一不同是控制客户端(浏览器(的"人"。硒代替人类。

您的Web应用程序和单元测试应用程序是两个不同的应用程序。您只能创建两个不同的Ninject注册:

1(当Web应用程序启动

时,NinjectWebCommon将运行

2(像NinjectUnitTestsCommon之类的东西将由所有测试之前由单位测试框架运行

最新更新