可能重复:
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);
}
请有人让我知道存根和模拟之间的区别以及它在上面代码中的实现..
答案 0 :(得分:1)
Stub:给你一个股票回答的东西,或者至多是一个属性包行为或者什么都不做但只能返回void的方法。
假冒:给你上演行为的东西,这样你就可以人为地测试那个班级客户的几个场景。模拟:可以编程的东西,在被调用的不同时间给出不同的响应。它将根据您是否希望检查调用它们被调用的顺序来控制。大多数模拟框架也为您提供存根功能。
以上各项的部分变体:通过假,可以包装存根,另一个假,模拟或真实实现,并仅为特定参数执行某些操作。