Почему Мок выбрасывает «ожидаемый вызов на макет хотя бы один раз». Где, поскольку он устанавливается один раз, даже если он установлен на ноль? - PullRequest
6 голосов
/ 06 апреля 2010

Ниже приведен код. создайте класс lib, добавьте ссылку на NUnit framework 2.5.3.9345 и Moq.dll 4.0.0.0 и вставьте следующий код. Попробуйте запустить его на моей машине, он выдает

TestCase
'MoqTest.TryClassTest.IsMessageNotNull'
ошибка: Moq.MockException: ожидается
вызов на макет хотя бы один раз,
но никогда не был выполнен: v => v.Model
= It.Is (значение (Moq.It + <> c__DisplayClass2 1[MoqTest.GenInfo]).match)<br> at<br> Moq.Mock.ThrowVerifyException(IProxyCall<br> expected, Expression expression, Times<br> times, Int32 callCount) at<br> Moq.Mock.VerifyCalls(Interceptor<br> targetInterceptor, MethodCall<br> expected, Expression expression, Times<br> times) at<br> Moq.Mock.VerifySet[T](Mock 1 макет,
Действие 1 setterExpression, Times<br> times, String failMessage) at<br> Moq.Mock 1.VerifySet (Action`1
setterExpression) Class1.cs (22,0): в
MoqTest.TryClassTest.IsMessageNotNull ()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Moq;
using NUnit.Framework;

namespace MoqTest
{
    [TestFixture]
    public class TryClassTest
    {
        [Test]
        public void IsMessageNotNull()
        {
            var mockView = new Mock<IView<GenInfo>>();
            mockView.Setup(v => v.ModuleId).Returns("");

            TryPresenter tryPresenter = new TryPresenter(mockView.Object);
            tryPresenter.SetMessage(new object(), new EventArgs());
            // mockView.VerifySet(v => v.Message, Times.AtLeastOnce());
            mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));
        }
    }

    public class TryPresenter
    {
        private IView<GenInfo> view;
        public TryPresenter(IView<GenInfo> view)
        {
            this.view = view;
        }

        public void SetMessage(object sender, EventArgs e)
        {
            this.view.Model = null;
        }
    }

    public class MyView : IView<GenInfo>
    {
        #region Implementation of IView<GenInfo>

        public string ModuleId
        {
            get; set;
        }

        public GenInfo Model
        {
            get; set;
        }

        #endregion
    }

    public interface IView<T>
    {
        string ModuleId { get; set; }
        T Model { get; set; }
    }

    public class GenInfo
    {
        public String Message { get; set; }
    }
}

А если поменять одну строку

mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));

до

mockView.VerifySet(v => v.Model, Times.AtLeastOnce());    

работает нормально.

Я думаю, что исключение неверно.

1 Ответ

6 голосов
/ 08 апреля 2010

Вы используете следующее утверждение VerifySet:

mockView.VerifySet(v => v.Model = It.Is<GenInfo>(x => x != null));

, который в основном говорит "убедитесь, что я установил свойство Model с некоторым объектом GenInfo, который не является нулевым".

Затем вы устанавливаете свойство Model с нулевым объектом:

this.view.Model = null;

Конечно, утверждение неверно.

В вашем втором утверждении VerifySet

mockView.VerifySet(v => v.Model, Times.AtLeastOnce());

Вы говорите: "Утвердите, что свойство Model было установлено, с чем-либо , хотя бы один раз". Поскольку вы сделали Set (хотя и с нулем), конечно, утверждение проходит.

Я не думаю, что здесь есть какие-либо ошибки в поведении Мока.

...