使用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中的应用,代码下载:http://files.cnblogs.com/jackhuclan/ConsoleApplication6.rar
    完整的例子,请参考http://stephenwalther.com/archive/2008/03/23/tdd-introduction-to-rhino-mocks.aspx

转载于:https://www.cnblogs.com/jackhuclan/archive/2013/05/07/3064519.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值