C# 使用Moq创建具有自动填充属性的模拟?

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

我有一个对象(比如HttpContext或其他对象)要模拟。有时,在一些单元测试中,我被迫模拟大量的依赖项,并适当地设置它们的依赖项和值

下面是一些模拟httpcontext和另一个类的示例代码:

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