上下文
我有一个WebAPI应用程序,可以为多个Angular应用程序提供服务。 WebAPI应用程序使用Ninject来促进依赖注入。我们主要在控制器的构造函数中使用它
目前绑定看起来像这样:
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());
}
}
Unittest类看起来像这样:
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
}
问题
我想在我们的持续集成触发器中添加自动化测试。为了做到这一点,我们决定模拟存储库(使用moq,或者只返回伪数据的自定义)。是否有可能创建一个条件情况,当NinjectWebCommon类看到它被自动测试调用时,它会注入模拟存储库而不是真实存储库?
我不需要任何关于嘲弄的建议,仅针对Dependancy Injection。但是,如果你认为我做错了什么,请随意制作它们。我只是想确保设定一个明确的范围。
在这种情况下,最佳做法是什么?如果您认为合适,我可以改变我们目前的工作方式。
修改
因此自动化测试的问题就像Specflow与Selenium的结合。实际点击了specflow测试中指定的webapp上的按钮。与通常情况下手动浏览网站唯一不同的是,#34; person&#34;控制客户端(浏览器)。硒而不是人类。
答案 0 :(得分:1)
您的Web应用程序和单元测试应用程序是两个不同的应用程序。您只需创建两个不同的Ninject
注册:
1)NinjectWebCommon
将在Web应用程序启动时运行
2)类似于NinjectUnitTestsCommon
的东西,它将在所有测试之前由单元测试框架运行