存根和模拟实现

时间:2011-04-26 07:55:38

标签: .net mocking stub

  

可能重复:
  What are the differences between mocks and stubs on Rhino Mocks?

我正在使用单元测试的模拟。但是我无法在实现代码中区分mock和stub。 模拟实现代码是: -

[TestFixture]
    public class MockUser
    {
        [Test]
        public void SaveValidUserFileNameUsingMock()
        {
            UserMock um = new UserMock();
            um.uName = "";
            um.fName = "sfs.jpg";
            um.ContentType = "image/jpg";
            IUser usr = um;
            Assert.AreEqual("E:/image/kawade.jpg", usr.Save(um));
        }
    }

    public class UserMock : IUser
    {
        public string uName;
        public string fName;
        public string ContentType;

        public string Save(IUser u)
        {
            if (uName == "" || fName == "")
            {
                throw new ArgumentException("missing field name");
            }

            if (ContentType.Contains("image"))
            {
                string ext = Path.GetExtension(fName);
                return (string.Format("E:/image/{0}", this.uName + ext));
            }
            return "invalid";
        }
    }


        public interface IUser
        {
            string Save(IUser u);
        }

和要测试的课程是: -

public class User
    {
        public string uName;
        public string fName;
        //private IUser usr;

        public void Save(FileUpload fu, User usr)
        {
            if (uName == null || fName == null)
            {
                throw new ArgumentException("missing field name");
            }

            if (fu.PostedFile.ContentType.Contains("image"))
            {
                string ext = Path.GetExtension(fName);
                fu.SaveAs(string.Format("E:/image{0}", this.fName + ext));
            }
        }

并且正在使用相同的类进行存根测试。存根测试代码是: -

[TestFixture]
    public class UserTest
    {
        [Test]
        public void SaveUserValidFile()
        {
            UserStub su = new UserStub();
            su.uName = "kawade";
            su.fileName = "sfgs.png";
            su.Contenttype = "image/x-png";
            su.pName = "sdskjh";
            IUser target = su;

        }
    }

    internal class UserStub : IUser
    {
        public string uName;
        public string pName;
        public string Contenttype;
        public string fileName;


        public string Save(IUser u)
        {
            if (uName == null || pName == null)
            {
                throw new ArgumentException("user_name or pic_name is required");
            }

            if (Contenttype.Contains("image"))
            {
                string ext = Path.GetExtension(fileName);
                //return string.Format("C:/test/{0}", this.uName + ext);
                Assert.AreEqual("C:/Test/kawade.png", target.Save(su));
            }
            return "";
        }
    }

    public  interface IUser
    {
        string Save(IUser u);
    }

请有人让我知道存根和模拟之间的区别以及它在上面代码中的实现..

1 个答案:

答案 0 :(得分:1)

Stub:给你一个股票回答的东西,或者至多是一个属性包行为或者什么都不做但只能返回void的方法。

假冒:给你上演行为的东西,这样你就可以人为地测试那个班级客户的几个场景。

模拟:可以编程的东西,在被调用的不同时间给出不同的响应。它将根据您是否希望检查调用它们被调用的顺序来控制。大多数模拟框架也为您提供存根功能。

以上各项的部分变体:通过假,可以包装存根,另一个假,模拟或真实实现,并仅为特定参数执行某些操作。