[英]How to mock method call from other class in Rhino Mock AAA?
我有以下代码(简体)。
public class OrderProcessor
{
public virtual string PlaceOrder(string test)
{
OrderParser orderParser = new OrderParser();
string tester = orderParser.ParseOrder(test);
return tester + " here" ;
}
}
public class OrderParser
{
public virtual string ParseOrder(string test)
{
if (!string.IsNullOrEmpty(test.Trim()))
{
if (test == "Test1")
return "Test1";
else
{
return "Hello";
}
}
else
return null;
}
}
我的测试如下-
public class OrderTest
{
public void TestParser()
{
// Arrange
var client = MockRepository.GenerateMock<OrderProcessor>();
var spec = MockRepository.GenerateStub<OrderParser>();
spec.Stub(x => x.ParseOrder("test")).IgnoreArguments().Return("Test1");
//How to pass spec to client so that it uses the same.
}
}
现在如何测试客户端,以便它使用OrderParser中的模拟方法。 我可以模拟OrderParser,但如何将其传递给orderProcessor模拟类呢?
请让我知道。
提前致谢。
我对您的测试有些困惑,因为除了RhinoMocks可以工作之外,您还没有真正进行任何测试。 您创建两个模拟,然后对它们进行一些声明。 您甚至还没有测试过真实的课程。
如果您确实想获得良好的单元测试,则需要进行一些依赖注入。 您可以快速重构代码以使用接口和依赖项注入来使测试有效。
首先从OrderParser类提取接口:
public interface IOrderParser
{
String ParseOrder(String value);
}
现在确保您的OrderParser类实现了该接口:
public class OrderParser: IOrderParser{ ... }
现在,您可以重构OrderProcessor类,以通过其构造函数接受IOrderParser对象的实例。 这样,您可以将依赖项“注入”到类中。
public class OrderProcessor
{
IOrderParser _orderParser;
public OrderProcessor(IOrderParser orderParser)
{
_orderParser = orderParser;
}
public virtual string PlaceOrder(string val)
{
string tester = _orderParser.ParseOrder(val);
return tester + " here" ;
}
}
在测试中,您只想模拟依赖关系,而不是SUT(被测对象)。 您的测试如下所示:
public class OrderTest
{
public void TestParser()
{
// Arrange
var spec = MockRepository.GenerateMock<IOrderParser>();
var client = new OrderProcessor(spec);
spec.Stub(x => x.ParseOrder("test")).IgnoreArguments().Return("Test1");
//Act
var s = client.PlaceOrder("Blah");
//Assert
Assert.AreEqual("Test1 Here", s);
}
}
对我来说,很难评估您要如何对自己的班级做些什么,但是您应该能够从中得到启发。 需要遵循的一些公理:
您似乎处在正确的轨道上,但需要一些指导。 我建议阅读Martin Fowler和Bob Martin必须掌握的材料。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.