请查看我的测试架构(在内存数据库中)

时间:2010-10-18 10:40:48

标签: c# unit-testing tdd

我刚开始进行单元测试,想知道我是否走在正确的轨道上。你们可以看看我的代码并告诉我你的想法吗?

这是我要测试的(基本)方法:

public void Accept(long resumeId)
{
   // Get the resume that has to be accepted
   Resume originalResume = ResumeDAC.GetById(id);

   // Make a copy of the resume
   Resume resumeCopy = CopyResume(originalResume );

   // Accept the original resume and lock it
   originalResume .AcceptAndLock();

   // Accept the copy and keep it open for editing
   resumeCopy.AcceptAndKeepOpen();

   // Add the copy to the database
   ResumeDAC.Add(resumeCopy);

   // Commit everything
   ResumeDAC.Commit();
}

我想测试的是:

  • 原始简历的状态为“AcceptedAndLocked”
  • 复制的简历的状态为“AcceptedAndOpen”
  • 复制的简历已添加到数据库

我不想在这个测试中使用实际的数据库,但我有两个使用数据库的类:EmployeeDAC和ResumeDAC。 EmployeeDac很简单,所以我用Rhino Mocks嘲笑它。 我认为ResumeDAC有点困难,因为制作了“简历副本”并将其添加到数据库中。我想声明恢复副本已添加到数据库中。

让我们来看看我的测试代码:

[TestMethod]
public void TestAcceptResume()
{
   // Arrange
   // These two classes are used for database actions
   EmployeeDAC mockEmployeeDAC = ArrangeEmployeeDAC(); // Simply mocked with Rhino Mocks
   TestResumeDAC mockResumeDac = new TestResumeDAC(); //I've created my own test double. See below

   // Inject the two Data Access Classes into the ResumeService
   var resumeService = new ResumeService("", mockResumeDac, mockEmployeeDAC);

   // Act
   var resume = resumeService.Accept(3);

   // Assert
   Resume origResume = mockResumeDac.Resumes.Single(it => it.Id == resumeId);
   Assert.AreEqual("AcceptedAndLocked", origResume.StatusName);
   Assert.AreEqual(4, mockResumeDac.Resumes.Count); // Expect 4 records in the database
}

这是我自己的测试中使用的ResumeDAC(数据访问类)的版本

internal class TestResumeDAC : ResumeDAC
{
   public TestResumeDAC() : base()
   {
      Resumes = new List<Resume>();

      // Add resumes to the list
      AddResumes();
   }

   public List<Resume> Resumes { get; set; }

   public override void Add(Resume resume)
   {
      Resumes.Add(resume);
   }

   public override void Commit()
   {
   }

   public override Resume GetById(long id)
   {
      return Resumes.SingleOrDefault(it => it.Id == id);
   }
}

正如你所看到的,我已经在内存数据库中做了一些。这使我很容易看到是否添加或删除了对象等。

所以我的问题是:你觉得这段代码怎么样?如果这不是要走的路,或者我在思考,提示等方面做出的任何错误,请告诉我。

1 个答案:

答案 0 :(得分:1)

我猜这个代码不适合你。是吗?你没说......

无论如何,在我的一位经理的要求下,我仔细研究了单元测试。我最终使用了Roy Osherove的“单元测试艺术”。这是对单元测试的非常好的介绍。

您可能认为ResumeDAC是静态类。要使用测试类ResumeDAC覆盖它,您必须摆脱静态方法调用。

在任何情况下,手头的问题都可能用您的测试版本替换ResumeDAC。这称为“依赖注入”。