【问题标题】:Moq.MockException: The following setups on mock were not matchedMoq.MockException:模拟上的以下设置不匹配
【发布时间】:2019-05-31 19:13:22
【问题描述】:

在下面的代码中,我使用Moq 编写示例测试。我创建了一个模拟对象,我正在使用SetupProperty 设置要为该属性返回的假值。但我在_sharedService.VerifyAll() 行遇到了上述错误。

我知道我遗漏了一些微不足道的东西,但不确定是什么。有人可以帮忙吗?

[TestFixture]
public class ObjectFactoryTests : TestFixtureBase
{
    private Mock<ISharedService> _sharedService;

    [SetUp]
    public void SetUp()
    {
        _sharedService = new Mock<ISharedService>(MockBehavior.Strict);
    }

    protected override void VerifyAll()
    {
        _sharedService.VerifyAll();
    }

    private IObjectFactory GetObjectFactory()
    {
        return new ObjectFactory(sharedService.Object);
    }

    [Test]
    public void ObjectFactory_GenerateObject_Request_Success()
    {
        MyObject1 request = something;
        var requestData = new Dictionary<string, object>();
        requestData.TryAdd(Cache.Client, Constants.CLIENT);
        _sharedService.SetupProperty(m => m.RequestData, requestData);
        var factory = GetObjectFactory();
        var actual = factory.GenerateObject(request);
        Assert.That(actual.Client, Is.EqualTo(requestData[Cache.Client].ToString()), Constants.CLIENT);

        VerifyAll();
    }
}

public class ObjectFactory : IObjectFactory
{
    ISharedService SharedService = something;

    public MyObject GenerateObject(MyObject1 request)
    {
        MyObject obj = new MyObject(request);
        obj.Client = SharedService.RequestData[Cache.Client].ToString();
        return obj;
    }
}

【问题讨论】:

  • 代码看起来不完整。 1.在GetObjectFactory()中调用的类ObjectFactory()没有构造函数。 2. return new ObjectFactory(sharedService.Object) 行,sharedService 没有下划线。请把完整的代码贴出来,我们才能给出肯定的答案。

标签: c# moq


【解决方案1】:

如果我理解正确,您尝试设置属性期望。

尝试关注而不是_sharedService.SetupProperty(m =&gt; m.RequestData, requestData);

_sharedService.Setup(foo => foo.RequestData).Returns(requestData);

您可以在Moq documentation阅读更多信息

【讨论】:

    【解决方案2】:

    对于 get-set peoperty,SetupProperty 将创建两种设置:一种用于 getter,另一种用于 setter。由于您只读取属性,因此设置器的属性不匹配,因此错误。

    为避免这种情况,请使用 mock.SetupGet(m =&gt; m.Property).Returns(() =&gt; value) 仅为 getter 创建设置。

    顺便说一句:SetupProperty 实际上与您想象的目的不同:它不应该被用来建立期望;相反,它用于“存根”一个属性,以便它保留它被设置为最后的值。 Verify[All] 甚至在其检查中包含此类存根属性这一事实可能是一个错误(已在 SetupAllProperties 中修复)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-02
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多