我正在为基于mvc的项目设计架构。为了更好的方法,我想使用TDD(使用NUnit框架)模式。我在项目中已经陷入困境。
函数调用的执行方式与图层的编号相同。 我想从'应用服务层'(不是来自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)一起用于具有多个层的应用程序?
答案 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的结果。您不应该一次测试多个图层。更好的方法是单独测试您的图层,因此您应该尝试模拟/存根您的依赖项。您可以使用模拟框架来设置依赖项的预期行为。