Moq не удалось для SetupSet / VerifySet - PullRequest
1 голос
/ 07 марта 2020

Я новичок в Moq, и у меня есть эта тестовая функция:

using Moq;
using Xunit;

namespace MyTest
{
    public class UseMoq
    {
        public interface IFoo
        {
            string Name { get; set; }
        }
        [Fact]
        public static void UseMock()
        {
            var mock = new Mock<IFoo>();
            mock.SetupSet(foo => foo.Name = "foo");
            mock.VerifySet(foo => foo.Name = "foo");
        }
    }
}

Он запускается и не работает, говоря:

Message: 
    Moq.MockException : 
    Expected invocation on the mock at least once, but was never performed: foo => foo.Name = "foo"

    Performed invocations:

    Mock<UseMoq.IFoo:1> (foo):
    No invocations performed.

Stack Trace: 
    Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage)
    Mock.VerifySet(Mock mock, LambdaExpression expression, Times times, String failMessage)
    Mock`1.VerifySet(Action`1 setterExpression)
    ... ...

Что на самом деле означает это сообщение об ошибке, и как это исправить?

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Платформа для имитации ведет себя так, как задумано.

Вы вызываете команду "Подтвердить" на члене, который не был вызван. Вот почему вы получаете ошибку в показанном вами примере.

mock.SetupSet(foo => foo.Name = "foo"); //<--Setup expectation
mock.VerifySet(foo => foo.Name = "foo"); //<--Verify expectation

Поскольку установка указывает, что среда моделирования должна ожидать определенного поведения, но

Не выполняется никаких вызовов.

, как указано в сообщении об ошибке

Ожидаемый вызов на макет хотя бы один раз, но так и не был выполнен: foo => foo.Name = "foo"

Тем не менее, методы Verify* как обычно вызывается в фазе Assert тестового случая. К тому времени имитация использовалась бы в качестве зависимости каким-либо испытуемым субъектом, и смоделированный элемент вызывался, как и ожидалось, при выполнении испытуемого предмета.

//Arrange

//...initialize mock...

mock.SetupSet(foo => foo.Name = "foo"); //<--Setup expectation

//Act
//...subject under test uses mock

//Assert
mock.VerifySet(foo => foo.Name = "foo"); //<--Verify expectation

Просмотрите Быстрый запуск MOQ: проверка для большего количества примеров.

1 голос
/ 07 марта 2020

Сбой из-за того, что у вас нет реализации, чтобы проверить изменение значения свойства, вы должны изменить его через реализацию, а не через интерфейс

, возможно, вам поможет пример

public class UseMoq
{
    public interface IFoo
    {
        string Name { get; set; }
    }

    public class Foo : IFoo
    {
        private readonly IFoo _foo;

        public Foo(IFoo foo)
        {
            _foo = foo;
        }

        public string Name { get; set; }

        public string GetName()
        {
            return _foo.Name;
        }

        public void SetName(string name)
        {
            _foo.Name = name;
        }
    }

    [Fact]
    public static void UseMock()
    {
        var mock = new Mock<IFoo>();
        mock.SetupGet(x => x.Name).Returns("foo");

        var fooName = new Foo(mock.Object).GetName();

        mock.VerifyGet(m => m.Name, Times.Once);



        /*
         * Another TestMethod

         */

        new Foo(mock.Object).SetName("new Foo Name");

        mock.VerifySet(m => m.Name = "new Foo Name",Times.Once);

    }
}
...