我刚开始进行单元测试,想知道我是否走在正确的轨道上。你们可以看看我的代码并告诉我你的想法吗?
这是我要测试的(基本)方法:
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();
}
我想测试的是:
我不想在这个测试中使用实际的数据库,但我有两个使用数据库的类: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);
}
}
正如你所看到的,我已经在内存数据库中做了一些。这使我很容易看到是否添加或删除了对象等。
所以我的问题是:你觉得这段代码怎么样?如果这不是要走的路,或者我在思考,提示等方面做出的任何错误,请告诉我。
答案 0 :(得分:1)
我猜这个代码不适合你。是吗?你没说......
无论如何,在我的一位经理的要求下,我仔细研究了单元测试。我最终使用了Roy Osherove的“单元测试艺术”。这是对单元测试的非常好的介绍。
您可能认为ResumeDAC
是静态类。要使用测试类ResumeDAC
覆盖它,您必须摆脱静态方法调用。
在任何情况下,手头的问题都可能用您的测试版本替换ResumeDAC
。这称为“依赖注入”。