首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SetupSet/VerifySet的Moq失败

SetupSet/VerifySet的Moq失败
EN

Stack Overflow用户
提问于 2020-03-07 13:23:32
回答 2查看 433关注 0票数 1

我是Moq的新手,我有这样的测试功能:

代码语言:javascript
复制
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");
        }
    }
}

它运行并失败,说:

代码语言:javascript
复制
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)
    ... ...

这个错误信息实际上意味着什么,以及如何修复它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-08 04:19:56

模拟框架正在按照设计的方式运行。

您正在对未被调用的模拟成员调用“验证”。这就是为什么在显示的示例中出现错误的原因。

代码语言:javascript
复制
mock.SetupSet(foo => foo.Name = "foo"); //<--Setup expectation
mock.VerifySet(foo => foo.Name = "foo"); //<--Verify expectation

因为安装程序告诉模拟框架期望某些行为,但是

不执行调用。

如失败消息所述

至少在模拟上预期调用一次,但从未执行: foo => foo.Name = "foo“

也就是说,通常在测试用例的断言阶段中调用的Verify*方法。到那时,模拟将被一些被测试的主体用作依赖项,被模拟的成员在行使被测试的主体时会按预期调用。

代码语言:javascript
复制
//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 Quickstart:核查以获得更多示例。

票数 1
EN

Stack Overflow用户

发布于 2020-03-07 14:30:10

它失败是因为您没有实现,要测试属性值的更改,必须通过实现而不是通过接口来更改它。

也许这个例子对你有帮助

代码语言:javascript
复制
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);

    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60577967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档