【问题标题】:How to spy method return value by NSubstitute如何通过 NSubstitute 监视方法返回值
【发布时间】:2019-06-09 11:36:06
【问题描述】:

我想监视 NSubstitute 中模拟接口的模拟方法的返回值。我得到Received 函数的返回值,但它总是返回null

public interface IFactory
{
    object Create();
}

public interface IMockable
{
    object SomeMethod();
}

public class Mockable : IMockable
{
    private readonly IFactory factory;

    public Mockable(IFactory factory)
    {
        this.factory = factory;
    }

    public object SomeMethod()
    {
        object newObject = factory.Create();
        return newObject;
    }
}

public class TestClass
{
    [Fact]
    void TestMethod()
    {
        var factory = Substitute.For<IFactory>();
        factory.Create().Returns(x => new object());
        IMockable mockable = new Mockable(factory);
        object mockableResult = mockable.SomeMethod();
        object factoryResult = factory.Received(1).Create();
        Assert.Equal(mockableResult, factoryResult);
    }
}

我希望 mockableResultfactoryResult 相等,但 factoryResultnull

【问题讨论】:

    标签: c# unit-testing nsubstitute spy


    【解决方案1】:

    那是因为你用错了。 Received 是对被调用方法的断言。它不会从模拟成员返回可用值。

    查看以下修改后的测试版本,该版本的行为符合您的预期。

    public class TestClass {
        [Fact]
        void TestMethod() {
            //Arrange
            object factoryResult = new object(); //The expected result
            var factory = Substitute.For<IFactory>();
            factory.Create().Returns(x => factoryResult); //mocked factory should return this
            IMockable mockable = new Mockable(factory);
    
            //Act
            object mockableResult = mockable.SomeMethod(); //Invoke subject under test
    
            //Assert
            factory.Received(1).Create(); //assert expected behavior
            Assert.Equal(mockableResult, factoryResult); //objects should match
        }
    }
    

    【讨论】:

    • 我以同样的方式解决了它,但我想知道 nsubstitute 是否有更方便的解决方案来获取返回值。
    • @aliafshari 不只是调用factory.Create(),似乎没有任何其他方式“间谍”返回调用。
    • @aliafshari 我不确定您是否需要在此处查看Received。如果你只是Assert.Same(mockableResult, factory.Create());,唯一应该通过的方法是mockable 调用factory.Create()
    • @DavidTchepak 如何检查factory.Create 是否被多次调用并返回了创建的对象之一?
    • @aliafshari 要检查您是否需要 Received(1) 我认为(或存根 Create 返回 1 个值,然后返回一个不同的值或抛出)。我认为这一步是否值得取决于生产代码中出现该错误的可能性。
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多