C# 使用Moq创建具有自动填充属性的模拟?
我有一个对象(比如HttpContext或其他对象)要模拟。有时,在一些单元测试中,我被迫模拟大量的依赖项,并适当地设置它们的依赖项和值 下面是一些模拟httpcontext和另一个类的示例代码:C# 使用Moq创建具有自动填充属性的模拟?,c#,unit-testing,mocking,moq,C#,Unit Testing,Mocking,Moq,我有一个对象(比如HttpContext或其他对象)要模拟。有时,在一些单元测试中,我被迫模拟大量的依赖项,并适当地设置它们的依赖项和值 下面是一些模拟httpcontext和另一个类的示例代码: public static HttpContextBase FakeHttpContext() { var context = new Mock<HttpContextBase>(); var files = new Mock<Http
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var files = new Mock<HttpFileCollectionBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var user = new Mock<IPrincipal>();
var identity = new Mock<IIdentity>();
request.Setup(req => req.ApplicationPath).Returns("~/");
request.Setup(req => req.AppRelativeCurrentExecutionFilePath).Returns("~/");
request.Setup(req => req.PathInfo).Returns(string.Empty);
request.Setup(req => req.Form).Returns(new NameValueCollection());
request.Setup(req => req.QueryString).Returns(new NameValueCollection());
request.Setup(req => req.Files).Returns(files.Object);
response.Setup(res => res.ApplyAppPathModifier(MoqIt.IsAny<string>())).
Returns((string virtualPath) => virtualPath);
user.Setup(usr => usr.Identity).Returns(identity.Object);
identity.SetupGet(ident => ident.IsAuthenticated).Returns(true);
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
context.Setup(ctx => ctx.User).Returns(user.Object);
return context.Object;
公共静态HttpContextBase FakeHttpContext()
{
var context=newmock();
var files=newmock();
var request=newmock();
var response=newmock();
var session=newmock();
var server=newmock();
var user=new Mock();
var identity=newmock();
request.Setup(req=>req.ApplicationPath)。返回(“~/”;
Setup(req=>req.AppRelativeCurrentExecutionFilePath)。返回(“~/”;
request.Setup(req=>req.PathInfo).Returns(string.Empty);
request.Setup(req=>req.Form).Returns(newNameValueCollection());
request.Setup(req=>req.QueryString).Returns(newNameValueCollection());
request.Setup(req=>req.Files).Returns(Files.Object);
response.Setup(res=>res.ApplyAppPathModifier(MoqIt.IsAny()))。
返回((字符串virtualPath)=>virtualPath);
user.Setup(usr=>usr.Identity).Returns(Identity.Object);
identity.SetupGet(ident=>ident.IsAuthenticated).返回(true);
Setup(ctx=>ctx.Request).Returns(Request.Object);
Setup(ctx=>ctx.Response).Returns(Response.Object);
Setup(ctx=>ctx.Session).Returns(Session.Object);
Setup(ctx=>ctx.Server).Returns(Server.Object);
Setup(ctx=>ctx.User).Returns(User.Object);
返回context.Object;
}
registrationView=newmock();
registrationView.SetupGet(v=>v.Address).Returns(“Calle test”);
registrationView.SetupGet(v=>v.EmailAddress)。返回(“test@test.com");
registrationView.SetupGet(v=>v.Password).Returns(“testpass”);
registrationView.SetupGet(v=>v.FirstName).Returns(“Name”);
registrationView.SetupGet(v=>v.LastName).Returns(“姓氏”);
registrationView.SetupGet(v=>v.DaytimePhoneNumber)。返回(“666”);
registrationView.SetupGet(v=>v.whistalers).Returns(新列表(){
新用户批发商(true){CollaborationCode=“1234”,Region=“TestReg”,批发商代码=“10”,批发商名称=“TestWS”,RegionName=“RegTest”}});
我想知道:有没有一个库,只要调用“registrationView=new MockWithFilled properties();”,就可以让我用默认值填充属性来创建一个模拟?如果是,哪一个
谢谢您和亲切的问候。Moq允许您使用
registrationView.SetupAllProperties();
这将使所有属性跟踪其值(即,您可以将一些值写入属性并稍后检索),并将所有属性设置为其默认值
注意:您可以使用链式模拟创建(又名规范查询)更快地设置模拟
IRegistrationView view = Mock.Of<IRegistrationView>(ctx =>
ctx.Address == "Calle test" &&
ctx.EmailAddress == "test@test.com" &&
ctx.Password == "testpass" &&
ctx.FirstName == "Name" &&
ctx.LastName == "Surname");
IRegistrationView视图=Mock.Of(ctx=>
ctx.Address==“调用方测试”&&
ctx.EmailAddress==”test@test.com" &&
ctx.Password==“testpass”&&
ctx.FirstName==“Name”&&
ctx.LastName==“姓氏”);
现在你可以做:
Mock.Of<IMyclass>()
Mock.Of()
这将为您提供一个要传递的默认对象,如果您真的不需要该对象,并且它的函数的默认答案是确定的,这就可以了。这就是我需要知道的:)。谢谢@SergeyFor http上下文,有一堆字段是只读的。mock可以向这些中注入一些东西吗?有没有办法用非默认值设置属性?例如,带有随机字符串的地址
Mock.Of<IMyclass>()