使用RhinoMocks

2019-04-14 08:36发布

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(); 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();
                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 Select();

            bool Save(IProduct product);
        }
    }

    private IEnumerable _fakeProducts = new List
                    {
                       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();

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

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

                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



热门文章