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

时间:2019-05-31 19:13:23

标签: c# moq

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

2 个答案:

答案 0 :(得分:1)

要进行获取操作,SetupProperty将创建两个设置:一个用于getter,一个用于setter。由于您只读取属性,因此该设置器的属性不匹配,因此会出现错误。

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

顺便说一句:SetupProperty实际上具有与您可能想到的目的不同的目的:不应将其用于设定期望;取而代之的是,它用于“存根”属性,以使其保留设置为last的值。 Verify[All]甚至在其检查中包括此类存根属性的事实可能是一个错误(已在SetupAllProperties中得到修复)。

答案 1 :(得分:0)

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

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

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

您可以在Moq documentation

中阅读更多信息。