【问题标题】:Using IOC To Configure Unit and Integration Tests使用 IOC 配置单元和集成测试
【发布时间】:2012-09-19 23:43:04
【问题描述】:

我有一个单元测试项目,它使用 Ninject 来模拟数据库存储库。我想使用这些相同的测试作为集成测试,并使用 Ninject 将我的真实数据库存储库绑定回它们各自的实现,以便在数据库中测试/强调应用程序。

有没有办法用 Visual Studio 2012 做到这一点,或者是否有其他测试框架,除了 MSTest,它允许这种类型的配置?

我真的不想将这些单元测试重写/复制到集成测试项目中,但我怀疑我可以将文件作为链接复制,并将单个测试文件编译到两个项目(单元和集成)中。

谢谢 托德

【问题讨论】:

    标签: unit-testing inversion-of-control integration-testing mstest


    【解决方案1】:

    你的要求对我来说听起来很奇怪。单元测试和集成测试之间的区别远不止是否连接到数据库。集成测试要么具有更大的范围,要么测试组件是否正确通信。当您编写单元测试时,此类单元的范围通常很小(一个类/组件,所有依赖项都被模拟出来),这意味着不需要使用 DI 容器。

    让我换一种说法。当测试完全相同时,您为什么有兴趣在使用和不使用数据库的情况下进行相同的测试。只需将数据库留在其中并进行测试即可。除了这些测试之外,您还可以添加“真正的”单元测试,其范围要小得多。

    【讨论】:

    • 假设我有一个实现 IService 的服务,它依赖于由 SqlServiceRepository 实现的 IServiceRepository 并且它访问 SQL DB。我想运行以 IService 为目标的单元测试,因此我创建了一个实现 IServiceRepository 的 MockServiceRepository 并使用 DI 为仅使用内存中集合的 Mock 存储库切换 SQL 存储库。这在本地完美运行,也可以在我的构建服务器上运行。现在我想使用相同的单元测试来测试 SqlRepository,但我想使用 SQL Repository 而不是使用 Mock Repository。
    • 您正试图重用相同的测试来测试完全不同的东西。编写一个不同的测试来单独测试 SqlRepository。这样测试就更有针对性,也更值得信赖。
    • 同意这会起作用,但是我没有得到端到端测试,这就是我所说的集成测试。
    • 端到端测试是验收测试。这是你应该让用户做的事情。甚至可以使用 FitNesse 自动执行此操作。如果您有足够的集成测试和单元测试,您将非常确定系统按预期工作。
    【解决方案2】:

    使用 Nunit,您可以使用 TestCase 做到这一点,

    说您需要使用 CustomerRepository 和 OrderRepository 使用单元和单元/集成测试,

    [TestFixture]
    public class TestCustomerRepository
    {
        IKernel _unit;
        Ikernel _integration;
    
        [SetUp]
        public void Setup()
        {
           //setup both kernels
        }
    
        [TestCase("Unit")]
        [TestCase("Integration")]
        public void DoTest(String type)
        {
            var custRepo = GetRepo<ICustomerRepository>(type);
            var orderRepo = GetRepo<IOrderRepository>(type);
            //do the test here
        }
    
        protected T GetRepo<T>(String type)
        {
            if (type.Equals("Unit"))
            {
                return _unit.Get<T>();
            }
            return _integration.Get<T>();
        }
    }
    

    这是基本思想。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2010-11-30
      相关资源
      最近更新 更多