TDD使用MVC存储库模式

时间:2014-03-04 07:38:45

标签: c# model-view-controller tdd nunit

我正在为基于mvc的项目设计架构。为了更好的方法,我想使用TDD(使用NUnit框架)模式。我在项目中已经陷入困境。

  1. MVC项目
  2. 应用服务层。
  3. 域名服务层
  4. 基础架构层
  5. 函数调用的执行方式与图层的编号相同。 我想从'应用服务层'(不是来自MVC的控制器)使用TDD概念。 首先告诉我,从MVC以外的层使用TDD是正确的方法。第二,我很困惑,如果我这样做,我将如何调用应用程序层函数进行crud操作,因为应用程序层函数有内部调用域服务层函数进行crud操作。我尝试直接调用应用程序层函数通过创建它的类对象来实现,但它给出的错误是对象引用没有设置为对象的实例。

    我的代码是

    using ApplicationServices.AppServiceInterfaces;
    using ApplicationServices.AppServiceClasses;
    using PeocitEntities.MasterEntities;
    
     namespace MyUnitTest
    {
    [TestFixture]
    public class Account_Group
    {
        AccountGroupApplnService accApplicationServiceObject;
    
        [TestFixtureSetUp]
        public void SetupTest()
        {
            accApplicationServiceObject = new AccountGroupApplnService();//Here iam getting error
        }
    
        [Test]
        public void AddAccountGroup()
        {
    
            AccountGroup accountGroupObj = new AccountGroup();
    
            accountGroupObj.strName = "Test TDD Group";
            accountGroupObj.intGroupType = 10;
            accountGroupObj.groupType_name = Enum.GetName(typeof(EnumTypelib.glAccountGroupTypes), accountGroupObj.intGroupType);
            accountGroupObj.intPrimaryGroup = (int)EnumTypelib.PrimaryGroupType.as_liabilities;
            bool IsGroupAccountCreated = accApplicationServiceObject.CreateAccountGroup(accountGroupObj);//Internally calls service & then infra layer.
            Assert.True(IsGroupAccountCreated);
        }
    
    
        [TestFixtureTearDown]
        public void TearDownTest()
        {
            accApplicationServiceObject = null;
        }
    }
    

    }

    我的问题是如何将TDD(与Nunit)一起用于具有多个层的应用程序?

2 个答案:

答案 0 :(得分:2)

您应该考虑的方法是 Outside-In TDD 。我将在非常广泛的笔触中概述一个概述,但我强烈建议您学习Growing Object-Oriented Software Driven by Tests和/或Outside-In Test-Driven Development以获取更多详细信息。

步行骷髅&尖峰

说TDD排除了除单元测试以外的任何东西是不正确的。使用Outside-In,我们的第一个测试应该使用我们应用程序的外部边界,并使用最小的可行功能。

然后,我们可以针对所有边界的最薄可能功能片段编写端到端测试,从外部到最内层运行系统。此时,如果您要触摸外部依赖项(如数据库),例如,您将需要使用NUnit的[SetUp][TearDown]属性来初始化和删除每个测试的假数据

完成这些步骤的时间可能比我们预期的要长,因为可能需要设置大量的基础架构。但是,这样做可以确保我们有一个可行的架构来构建。

接受&单元测试

在这一点上,我们不会为我们的努力付出很多努力,我们希望开始用一些有用的行为填写细节。在实现单个功能之前,可以编写该功能的广泛验收测试,然后我们可以放大单元级别并在较小的范围内利用red-green-refactor周期 - 单元 - 构建不同的层我们的申请。

这是我们使用mocking framework将每个单元与其余部分隔离开来的时候。如果我们保持类似于onion architecture的东西,不断应用TDD,我们最终会得到一个经过充分测试的,松散耦合的系统。

答案 1 :(得分:0)

如果我明白你的意思,你没有描述单元测试,那么你正在描述* integration *测试,这不应该是TDD的结果。您不应该一次测试多个图层。更好的方法是单独测试您的图层,因此您应该尝试模拟/存根您的依赖项。您可以使用模拟框架来设置依赖项的预期行为。