unit-testing - 使用 mvc api 和 ninject 进行单元测试

标签 unit-testing asp.net-web-api ninject

抱歉,如果这是一个愚蠢的问题,我只是不确定如何开始编写一些单元测试。

我有一个包含 api 和单元测试项目的解决方案。该 API 有一个存储库/接口(interface),用于使用 ninject 进行数据访问。

我的问题是如何对我的 api Controller 进行单元测试。我已经阅读了一些关于 Moq 的信息,但不确定是否需要使用它,因为我想针对我的数据库进行测试。

我读到我需要使用 [TestInitialize]属性

[TestInitialize]
public void MyTestInitialize()
{
  var kernel = NinjectWebCommon.CreatePublicKernel();
  kernel.Bind<BusinessController>().ToSelf();
}

我的问题是我的测试项目无法解决 CreatePublicKernel
检查 api 中的 NinjectWebCommon 类,没有名为 CreatePublicKernel 的函数。

我在这里想念什么?

最佳答案

Ninject(或其他 DI 库)仅用于向 Controller 的构造函数提供依赖项。例如。如果您需要BusinessController这需要两个存储库,然后 Controller 应该具有期望这些依赖项的构造函数:

public BusinessController(IUserRepository userRepository, 
                          IOrderRepository orderRepository)
{
    _userRepository = userRepository;
    _orderRepository = orderRepository;
}

如果你想写单元测试 对于您的 Controller ,您应该提供这些存储库的模拟实现。使用Moq或其他用于创建模拟的框架:
var userRepositoryMock = new Mock<IUserRepository>();
var orderRepositoryMock = new Mock<IOrderRepository>();
// setup mocks here
var controller = new BusinessController(userRepositoryMock.Object,
                                        orderRepositoryMock.Object);

如果您正在写 集成测试 对于您的 Controller ,您应该提供这些存储库的真实实现,这些存储库使用一些真实的数据库。
var userRepository = new NHibernateUserRepository();
var orderRepository = new NHibernateOrderRepository();
// prepare some data in database here
var controller = new BusinessController(userRepository, orderRepository);

您可以将 Controller 实例化移动到在每次测试之前执行的某个方法中(SetUp 或 TestInitialize 方法),以便从测试中删除代码重复。

更新:您还可以使用 Ninject 进行集成测试。只需创建 Ninject 模块,您的真实应用程序和集成测试都将使用它:
public class FooModule : NinjectModule
{
    public override void Load()
    {
        Bind<IUserRepository>().To<NHibernateUserRepository>();
        Bind<IOrderRepository>().To<NHibernateOrderRepository>();
        Bind<BusinessController>().ToSelf();
    }
}

然后使用此模块在 NinjectWebCommon.CreateKernel 方法中创建内核并在您的测试中创建内核:
var kernel = new StandardKernel(new FooModule());
var controller = kernel.Get<ValuesController>();

关于unit-testing - 使用 mvc api 和 ninject 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19490583/

相关文章:

c# - 使用 Web 请求为函数编写单元测试

c# - 如何在编写单元测试时访问方法的局部变量

c# - 在服务器端同时进行排序和分页的 DocumentDb 查询,可能吗?

c# - 在 .Net Core Web API 中使用 web.config 文件

c# - Dispose() 和 Ninject 指南

unit-testing - java.lang.ExceptionInInitializerError groovy编译加载错误

c# - 在单元测试时进行企业框架调用

c# - 自托管 Web Api 服务到 Windows 窗体

entity-framework - 如何通过 Ninject 获取 UnitOfWork 中的 DbContext 实例?

c# - Ninject 内核工厂 : Good Idea or Not