C# 如何通过NSubstitute监视方法返回值

C# 如何通过NSubstitute监视方法返回值,c#,unit-testing,nsubstitute,spy,C#,Unit Testing,Nsubstitute,Spy,我想在NSubstitute中监视模拟接口的模拟方法的返回值。我得到Received函数的返回值,但它总是返回null 公共接口IFactory { 对象创建(); } 公共接口IMockable { 对象方法(); } 公共类Mockable:IMockable { 私营只读电子工厂; 可公开模拟(IFactory工厂) { 这个工厂=工厂; } 公共对象方法() { object newObject=factory.Create(); 返回newObject; } } 公共类TestClas

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

公共接口IFactory
{
对象创建();
}
公共接口IMockable
{
对象方法();
}
公共类Mockable:IMockable
{
私营只读电子工厂;
可公开模拟(IFactory工厂)
{
这个工厂=工厂;
}
公共对象方法()
{
object newObject=factory.Create();
返回newObject;
}
}
公共类TestClass
{
[事实]
void TestMethod()
{
var factory=替换为();
Create()返回(x=>newobject());
IMockable mockable=新的mockable(工厂);
object mockableResult=mockable.SomeMethod();
object factoryResult=factory.Received(1.Create();
Assert.Equal(mockableResult、factoryResult);
}
}

我希望
mockableResult
factoryResult
相等,但
factoryResult
为空。

这是因为您使用不正确
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
    }
}
公共类TestClass{
[事实]
void TestMethod(){
//安排
object factoryResult=新对象();//预期结果
var factory=替换为();
factory.Create().Returns(x=>factoryResult);//模拟工厂应返回此
IMockable mockable=新的mockable(工厂);
//表演
object mockableResult=mockable.SomeMethod();//调用测试中的主题
//断言
factory.Received(1.Create();//断言预期行为
Assert.Equal(mockableResult,factoryResult);//对象应匹配
}
}

这是因为您使用不正确
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
    }
}
公共类TestClass{
[事实]
void TestMethod(){
//安排
object factoryResult=新对象();//预期结果
var factory=替换为();
factory.Create().Returns(x=>factoryResult);//模拟工厂应返回此
IMockable mockable=新的mockable(工厂);
//表演
object mockableResult=mockable.SomeMethod();//调用测试中的主题
//断言
factory.Received(1.Create();//断言预期行为
Assert.Equal(mockableResult,factoryResult);//对象应匹配
}
}

我用同样的方法解决了这个问题,但我想知道nsubstitute是否有更方便的方法来获取返回值。@aliafshari不只是调用
工厂。Create()
似乎没有任何其他“监视”调用返回的方法。@aliafshari我不确定您是否需要在此处检查
接收的
。如果您只是
Assert.Same(mockableResult,factory.Create())
,唯一应该通过的方法是调用
mockable
factory.Create()
@DavidTchepak如何检查
factory.Create
是否被多次调用并返回一个已创建的对象?@aliafshari检查是否需要
已收到(1)
(或存根
Create
返回1个值,然后是另一个值或抛出)。这一步是否值得,我想取决于生产代码中出现错误的可能性。我用同样的方法解决了它,但我想知道nsubstitute是否有更方便的方法来获取返回值。@aliafshari,不只是调用
工厂。Create()
似乎没有任何其他“间谍”方法调用的返回。@aliafshari我不确定您是否需要在此处检查
接收的
。如果您只是
断言.Same(mockableResult,factory.Create());
,则应该通过的唯一方法是
mockable
调用
factory.Create()
@DavidTchepak如何检查
factory.Create
是否被多次调用并且返回了一个已创建的对象?@aliafshari检查您是否需要
接收(1)
我认为(或者存根
Create
返回1个值,然后是另一个值或抛出).我认为这一步是否值得,取决于生产代码中出现错误的可能性有多大。