1

我使用 Moq 来测试一些行为。我想将设置视图的模型属性验证为 Message 类的新实例:

[TestFixture]
public class MessageFormPresenterTests
{
    private NameValueCollection queryString;
    private Mock<IDatabase> mockDatabase;
    private Mock<HttpContextBase> mockHttpContext;
    private Mock<HttpRequestBase> mockRequest;
    private Mock<HttpResponseBase> mockResponce;
    private Mock<IMessageFormView> mockView;
    private MessageFormPresenter presenter;

    [SetUp]
    public void SetUp()
    {
        this.queryString = new NameValueCollection();
        this.mockDatabase = new Mock<IDatabase>();
        this.mockHttpContext = new Mock<HttpContextBase>();
        this.mockRequest = new Mock<HttpRequestBase>();
        this.mockResponce = new Mock<HttpResponseBase>();
        this.mockView = new Mock<IMessageFormView>();

        this.mockHttpContext.SetupGet(c => c.Request).Returns(this.mockRequest.Object);
        this.mockHttpContext.SetupGet(c => c.Response).Returns(this.mockResponce.Object);

        this.mockRequest.SetupGet(r => r.QueryString).Returns(this.queryString);

        this.presenter = new MessageFormPresenter(this.mockView.Object) { Database = this.mockDatabase.Object, HttpContext = this.mockHttpContext.Object };
    }

    [Test]
    public void ViewLoad_QueryStringNotHasMessageIdParameter_PopulateViewModelAsNewMessage()
    {
        // Act
        this.mockView.Raise(v => v.Load += null, new EventArgs());

        // Assert
        this.mockView.VerifySet(v => v.Model = It.Is<Message>(m => m.Id == 0));
    }
}

但即使我没有在 MessageFormPresenter 中编写此功能,此测试也通过了。当我将断点设置为操作调用 (v.Model = It.Is(m => m.Id == 0)) 并调试我的测试时,Model 属性返回为“Castle.Proxies.MessageProxy”类型并具有默认的所有属性值(当然,Id 属性的值是 0)。

为什么会这样?我没有设置任何要返回的东西,Moq 默认情况下应该返回 null。

PS对不起我的英语不好。我希望你明白我在说什么)

UPDATE1:MessageFormPresenter 类:

    public class MessageFormPresenter : Presenter<IMessageFormView>
{
    private IDatabase database;

    public MessageFormPresenter(IMessageFormView view)
        : base(view)
    {
        View.Load += this.View_Load;
    }

    public IDatabase Database
    {
        get { return this.database ?? (this.database = DatabaseFactory.DatabaseInstance); }
        set { this.database = value; }
    }

    private void View_Load(object sender, EventArgs e)
    {
        int messageId;
        var messageParam = Request.QueryString[QueryParamNames.MessageId];

        if (messageParam == null)
        {
            View.Model = new Message();
            return;
        }

        if (!View.IsAdmin)
        {
            Response.Redirect(PageUrls.AccessDenied, true);
            return;
        }

        if (int.TryParse(
            messageParam,
            NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite,
            CultureInfo.InvariantCulture,
            out messageId))
        {
            View.Model = this.Database.Single<Message>(messageId);
        }
        else
        {
            Response.Redirect(PageUrls.DefaultPage, true);
        }
    }
}

Presenter<IMessageFormView>WebFormsMvp 框架提供的基类。

UPDATE2:如果我使用严格的行为 TargetInvocationException 将被抛出 MessageFormPresenter 的基本构造函数,即使我设置了Mock<IMessageFormView>.

4

0 回答 0