繁体   English   中英

如何模拟Rhino Mock AAA中其他类的方法调用?

[英]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);

        }
    }

对我来说,很难评估您要如何对自己的班级做些什么,但是您应该能够从中得到启发。 需要遵循的一些公理:

  1. 在继承中使用接口和组合
  2. 对外部依赖项使用依赖项注入 (控制反转)
  3. 测试单个单元,并模拟其依赖性
  4. 仅模拟一级依赖项。 如果要测试X类,而X类依赖于Y,而Y依赖于Z,则应该只嘲笑Y而不是Z。
  5. 始终测试行为 ,而不执行实现细节

您似乎处在正确的轨道上,但需要一些指导。 我建议阅读Martin FowlerBob Martin必须掌握的材料。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM