• 使用Rhino Mocks


    Rhino Mocks是TDD(测试驱动开发)中一个非常重要的组件,这篇文章简单地介绍下这个组件mock的使用。创建2个项目,

    1. 对抽象类的mock
      添加ProductBase类
      using System;

      namespace RhinoMockProject
      {
          public abstract class ProductBase
          {
              public abstract string Name { getset; }

              public abstract decimal Price { getset; }

              public abstract void Save();
          }
      } 

      [TestMethod]
              public void TestStubAbstract()
              {
                  ProductBase product = MockRepository.GenerateStub<ProductBase>();
                  product.Name = "Laptop Computer";
                  product.Price = 3200.00m;

                  Assert.AreEqual(3200.00m, product.Price);
              }


    2. 对接口的mock
      public interface IProduct
          {
              string Name { getset; }

              decimal Price { getset; }
          }

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;

      namespace RhinoMockProject
      {
          public class ProductManager
          {
              public static void DoublePrice(IProduct product)
              {
                  product.Price *= 2;
              }
          }
      }

      [TestMethod]
              public void TestStubInterface()
              {
                  decimal price = 3200.00m;
                  IProduct product = MockRepository.GenerateStub<IProduct>();
                  product.Name = "Laptop Computer";
                  product.Price = price;

                  ProductManager.DoublePrice(product);
                  Assert.AreEqual(price * 2, product.Price);
              }

    3. 对带有返回值方法的mock,注意对有返回值的对象进行mock,MockRepository必须实例化
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;

      namespace RhinoMockProject
      {
          public interface IProductRepository
          {
              IProduct Get(int ProductId);

              IEnumerable<IProduct> Select();

              bool Save(IProduct product);
          }
      }


      private IEnumerable<IProduct> _fakeProducts = new List<IProduct>
                      {
                         new Product {Name = "Steak", Price = 9.85m},
                         new Product {Name = "Milk", Price = 2.02m},
                         new Product {Name = "Diapers", Price = 33.07m}
                     };


              [TestMethod]
              public void TestStubInterfaceMethod()
              {
                  MockRepository mocks = new MockRepository();
                  IProductRepository products = mocks.Stub<IProductRepository>();

                  using (mocks.Record())
                  {
                      SetupResult.For(products.Select()).Return(_fakeProducts);
                  }

                  var results = products.Select();

                  Assert.AreEqual(3, results.Count());
              }

      mock多个返回值
      [TestMethod]
              public void TestStubMultipleReturn()
              {
                  MockRepository mocks = new MockRepository();
                  IProductRepository products = mocks.Stub<IProductRepository>();

                  using (mocks.Record())
                  {
                      SetupResult
                          .For(products.Get(2))
                          .Return(new Product { Name = "Beer", Price = 12.99m });

                      SetupResult
                          .For(products.Get(12))
                          .Return(new Product { Name = "Steak", Price = 8.02m });
                  }

                  // Test
                  IProduct product1 = products.Get(2);
                  Assert.AreEqual("Beer", product1.Name);

                  IProduct product2 = products.Get(12);
                  Assert.AreEqual("Steak", product2.Name);

                  IProduct product3 = products.Get(13);
                  Assert.IsNull(product3);
              }

              [TestMethod]
              public void TestStubIgnoreArguments()
              {
                  MockRepository mocks = new MockRepository();
                  IProductRepository products = mocks.Stub<IProductRepository>();

                  using (mocks.Record())
                  {
                      SetupResult
                          .For(products.Get(1))
                          .IgnoreArguments()
                       .Return(new Product { Name = "Beer", Price = 12.99m });
                  }

                  // Test
                  IProduct product1 = products.Get(2);
                  Assert.AreEqual("Beer", product1.Name);

                  IProduct product2 = products.Get(12);
                  Assert.AreEqual("Beer", product2.Name);
              }
      这篇文章简单地介绍了Rahino mock组件在tdd中的应用,代码下载:https://files.cnblogs.com/jackhuclan/ConsoleApplication6.rar
      完整的例子,请参考http://stephenwalther.com/archive/2008/03/23/tdd-introduction-to-rhino-mocks.aspx
    作者:Jackhuclan
    出处:http://jackhuclan.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【2012百度之星资格赛】G:聊天就是Repeat
    使用testNG进行并发性能测试
    关于处理高并发,防止库存超卖的问题
    关于java内存溢出的异常处理
    关于微服务架构
    关于MySQL绿色版的安装
    G点营销看来也不是@z营销的专利啊
    matlab+中文字体设计,有搞头没有? 有搞头
    字王字型系列命名草案
    国外字体设计师也是蛮重视数学的
  • 原文地址:https://www.cnblogs.com/jackhuclan/p/3064519.html
Copyright © 2020-2023  润新知