使用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
posted @ 2013-05-07 12:53  落叶潇潇雨  阅读(1060)  评论(0编辑  收藏  举报