使用RhinoMocks

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

对抽象类的mock

添加ProductBase类

using System;

namespace RhinoMockProject
{
    public abstract class ProductBase
    {
        public abstract string Name { get; set; }

        public abstract decimal Price { get; set; }

        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);
        }

  1. 对接口的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);
            }

  2. 对带有返回值方法的mock
    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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值