首页 > 解决方案 > 即使输入与模拟输入值不匹配,最小起订量函数调用也始终返回值

问题描述

我正在模拟一个带有两个参数的函数调用。1. 输入不可变类对象 2. 输出参数。

示例代码:

Mock<ISample> mockSample = new Mock<ISample>();

SampleClass MyKey = new SampleClass() { prop1 = 1 };
SampleOutput output = new SampleOutput() { prop2 = 2 };
mockSample.setup(s => s.SampleMethod(It.is<SampleKey>(t => t.Equals(MyKey)), 
out sampleOut))).Returns(true);

在实际代码执行中,如果密钥与模拟密钥相同,则此模拟函数返回正确的值,但是,我看到一个问题,即即使密钥不匹配,此模拟函数也返回相同的输出值。

有什么输入吗?

添加关键代码:

public class Key
{
    public readonly DateTime prop1;
    public readonly string prop2;
    public Key(DateTime prop1, string prop2)
    {
        this.prop1 = prop1;
        this.prop2 = prop2;
    }
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        if (ReferenceEquals(this, obj))
            return true;

        Key other = obj as Key;

        return this.prop1 == other.prop1 && string.Compare(this.prop2, other.prop2);
    }

    public override int GetHashCode()
    {
        return prop1.GetHashCode() ^ prop2.GetHashCode();
    }
}

标签: c#moqvs-unit-testing-framework

解决方案


据我了解这个问题,您需要在两种不同的行为上设置模拟。请看一下示例测试:

[TestFixture]
public class MoqTests
{
    [Test]
    public void MoqOutParameter()
    {
        // Arrange
        Mock<ISample> mockSample = new Mock<ISample>();

        Key MyKey = new Key(DateTime.Today, "SomeValue");
        SampleOutput sampleOut = new SampleOutput() { prop2 = 2 };

        mockSample.Setup(s => s.SampleMethod(It.Is<Key>(t => t.Equals(MyKey)),
            out sampleOut)).Returns(true);

        // Act  
        SampleOutput out1;
        var result1 = mockSample.Object.SampleMethod(new Key(DateTime.Today, "SomeValue"), out out1);

        SampleOutput out2;
        var result2 = mockSample.Object.SampleMethod(new Key(DateTime.MinValue, "AnotherValue"), out out2);

        // Assert
        Assert.True(result1);
        Assert.AreEqual(out1, sampleOut);

        Assert.False(result2);
        Assert.Null(out2);
    }
}

public class Key
{
    public readonly DateTime prop1;
    public readonly string prop2;

    public Key(DateTime prop1, string prop2)
    {
        this.prop1 = prop1;
        this.prop2 = prop2;
    }
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        if (ReferenceEquals(this, obj))
            return true;

        Key other = obj as Key;

        // was forced to add `== 0` to make it compilable
        return this.prop1 == other.prop1 && string.Compare(this.prop2, other.prop2) == 0;
    }

    public override int GetHashCode()
    {
        return prop1.GetHashCode() ^ prop2.GetHashCode();
    }
}

public class SampleOutput
{
    public int prop2 { get; set; }
}

public interface ISample
{
    bool SampleMethod(Key key, out SampleOutput sampleOut);
}

UPD:我添加了我在本示例中使用的类KeySampleOutput接口“ISample”,还添加了测试类。我正在使用 Nunit 启动测试,它一定没有意义。您可以根据需要使用任何单元测试框架。这个例子对我有用,测试是绿色的。请尝试一下并说出与您的环境不同的地方。另请注意,我已更改返回行Key.Equals以使其可编译。

希望能帮助到你。


推荐阅读