Moq.MockException:以下模拟设置不匹配

Moq.MockException: The following setups on mock were not matched

在下面的代码中,我使用 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;
    }
}

如果我没理解错的话,你试着设定属性期望值。

尝试以下而不是 _sharedService.SetupProperty(m => m.RequestData, requestData);:

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

您可以在 Moq documentation

中阅读更多信息

对于 get-set 人,SetupProperty 将创建两种设置:一种用于 getter,另一种用于 setter。由于您只阅读 属性,因此 属性 与 setter 不匹配,因此出现错误。

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

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