假设我有一个正在我正在测试的MainClass
方法中调用的类。
public class MainClass
{
private readonly SubClass;
// constructor not shown
public method TestMethod()
{
var data = SubClass.MethodA();
// ...some code
var moreData = SubClass.MethodB(someOtherData);
// ...more code
}
}
使用RhinoMock,我想为SubClass.MethodA()
创建一个存根,以便在测试中返回一组指定的数据,但是在调用SubClass.MethodB()
时,我想调用原始实现。
我不希望将SubClass'
两种方法分解为它们自己的类,因为它们适合SubClass
。有没有一种方法可以在RhinoMock中调用一个方法,同时在同一个类中调用另一个方法(不是存根)?
答案 0 :(得分:1)
我会使用提取和覆盖测试模式以及一个简单的存根。 这虽然没有明确地使用Rhino,但会适用于您的场景。
如果您不想沿着这条路走下去,可以考虑通过构造函数,公共setter或参数将Subclass注入MainClass,然后您可以先控制mocking子类。
我们的想法是创建一个子类存根可以覆盖的虚方法,以控制被测试类的一部分的行为。
public class MainClass
{
private readonly SubClass _subClass;
// constructor not shown
public void TestMethod()
{
var data = SubClassMethodACall();
// ...some code
var someOtherData = "";
var moreData = _subClass.MethodB(someOtherData);
// ...more code
}
protected virtual string SubClassMethodACall()
{
return _subClass.MethodA();
}
}
public class SubClass
{
public string MethodA()
{
return null;
}
public string MethodB(string s)
{
return null;
}
}
namespace Tests.Unit
{
public class MainClassStub : MainClass
{
private readonly string _returnValueForMethodA;
public MainClassStub(string returnValueForMethodA)
{
_returnValueForMethodA = returnValueForMethodA;
}
protected override string SubClassMethodACall()
{
return _returnValueForMethodA;
}
}
[TestFixture]
public class TestClass
{
[Test]
public void TestMethod()
{
var mainClass = new MainClassStub("this is the test value returned");
//.. rest of test
}
}
}