【问题标题】:Moq : Return null from a mocked method with nullable type起订量:从可空类型的模拟方法返回空
【发布时间】:2022-01-14 05:04:10
【问题描述】:

我在一个类似于下面的抽象类中有一个隐式运算符,它将数据转换为提供的类型。

public abstract class MyClass
{
    private object dataHolder; // just for representation
    // at implementation it tries to convert dataHolder object
    // or returns null if failed
    public abstract T? Convert<T>();
    public static implicit operator byte[]?(MyClass obj) => obj.Convert<byte[]?>();
}

我正在尝试为此类创建单元测试

[TestMethod]
public void MyTestMethod()
{
    Mock<MyClass> mockedClass = new() { CallBase = true };
    mockedClass.Setup(x => x.Convert<byte[]?>()); // no return statement
    // this should be null using implicit operator
    byte[]? output = mockedClass.Object;

    // however I am receiving an empty byte[] (length 0).
    Assert.IsNull(output);
}

如何验证我的输出也可以为空?

【问题讨论】:

    标签: c# unit-testing moq .net-6.0


    【解决方案1】:

    如果您想测试隐式运算符是否按预期工作,您只需验证是否调用了预期的底层方法。

    类似的东西;

    [Test]
    public void VerifyThatImplicitOperatorWorksAsExpected()
    {
        Mock<MyClass> mockedClass = new() { CallBase = true };
        mockedClass.Setup(x => x.Convert<byte[]?>()).Returns<byte[]?>(null);
        byte[]? output = mockedClass.Object;
    
        Assert.IsNull(output);
        // Verify that the Convert method was called.
        mockedClass.Verify(x => x.Convert<byte[]?>(), Times.Once);
    }
    

    【讨论】:

    • 我相信我正在测试的实现是隐式运算符。为此,我需要模拟 Convert 方法,我认为这是一个有效的场景?这里可能不明显的是,为了简单起见,我在示例中返回 obj.Convert() 时,我很可能正在做一些其他的防护,比如空检查/类型检查等,这是我应该测试的实现对吗?
    • 好的,知道了。我更新了我的答案!如果您在隐式运算符中提供更多示例代码,我可以详细说明(因为我认为其他断言将取决于情况)。
    • 感谢更新,但这并不能断言返回的值为 null,这是我要断言的。在示例中,这可用于验证隐式运算符,但这非常适用于在内部调用 Convert() 的任何方法。我很可能从其他方法调用 convert 方法并尝试模拟 Convert()。转换可能会使用我不想运行/设置来测试每个调用者的复杂逻辑?因此,模拟 Convert 更简单,但取决于其已知输出为 null 或 value(我能够测试的值部分)?
    • 这个问题是关于如何从 mocked Method() 返回空值。这可以是一个通用用例,而不是特定于操作员。基本上任何接受字节[]的方法?作为类型,并且可以返回一个可为空的返回值。当这样的方法返回空值时,我想测试流程。
    • 要返回null,您可以mockedClass.Setup(x =&gt; x.Convert&lt;byte[]?&gt;()).Returns((byte[])null)
    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多