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:厳密な動作を使用すると、のすべてのプロパティをセットアップしても、MessageFormPresenter の基本コンストラクターで TargetInvocationException がスローされますMock<IMessageFormView>

4

0 に答える 0