我希望为我的c#类编写一些单元测试。我有一个名为BaseClass
的基类,它有一个名为Execute
的抽象方法,还有一个名为Redirect
的方法。我有一个名为Class1
的类,它继承BaseClass
并实现抽象的Execute
方法,即我想测试的方法。以下代码进一步说明了设置:
public abstract class BaseClass
{
public abstract void Execute();
public void Redirect()
{
// redirect code here
}
}
public class Class1 : BaseClass
{
public void Execute()
{
// do some processing
this.Redirect();
}
}
我正在使用mstest并使用犀牛嘲笑进行嘲弄。我想编写Execute
方法的测试来测试它是否正常工作。
从上面可以看出,Execute
方法调用了基本方法Redirect
,所以我期望调用Redirect
方法。
我使用Rhino mocks mockrepository来创建Class1
的部分模拟。创建的模拟包含Execute
方法,该方法很棒,但不包含对Redirect
方法的引用,该方法位于Class1
中。我希望能够在模拟的存储库上设置一个期望Redirect
方法被调用。
有关如何使用rhino mocks创建测试以实现我所概述的任何提示或建议吗?
答案 0 :(得分:2)
如果您需要模拟该方法,则行为可能很复杂,您无法直接测试它。
出于这个原因,请考虑将该行为委托给合作课程,然后完全嘲笑该课程。
例如,如果execute方法将实体保存到数据库,我将创建一个存储库,依赖注入 - 通过构造函数注入该存储库,然后要求存储库保存我的实体。然后可以使用标准技术模拟整个协作类。
目前,您的班级似乎对此负责太多,这就是您遇到问题的原因。当Mocks用于表达协作时,它们可以非常有效地工作,这使我们能够创建具有单一职责的类,这使我们能够创建设计良好,可维护的代码。我推荐Steve Freeman and Nat Pryce's book on the subject。
答案 1 :(得分:1)
您必须将基类方法Redirect()
声明为virtual
,以便Rhino Mocks可以模拟它。以下对我有用:
public abstract class BaseClass
{
public abstract void Execute();
public virtual void Redirect()
{
// redirect code here
}
}
public class Class1 : BaseClass
{
public override void Execute()
{
// do some processing
this.Redirect();
}
}
..
var class1Mock = Rhino.Mocks.MockRepository.GeneratePartialMock<Class1>();
class1Mock.Expect(x => x.Redirect());
class1Mock.Execute();
class1Mock.VerifyAllExpectations();