Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 未调用xUnit设置函数_C#_Moq_Xunit - Fatal编程技术网

C# 未调用xUnit设置函数

C# 未调用xUnit设置函数,c#,moq,xunit,C#,Moq,Xunit,我有一个非常基本的单元测试。出于某种原因,测试仅在第一次通过,但所有后续调用均失败。以下是测试代码: private Mock<IMyInterface> _mockObject; public Test() { _mockObject = new Mock<IMyInterface>(); } [Fact] public void ItReturnsTheRightThing() { _mockObject.SetUp(o => o.Function

我有一个非常基本的单元测试。出于某种原因,测试仅在第一次通过,但所有后续调用均失败。以下是测试代码:

private Mock<IMyInterface> _mockObject;
public Test() {
   _mockObject = new Mock<IMyInterface>();
}

[Fact]
public void ItReturnsTheRightThing() {
   _mockObject.SetUp(o => o.FunctionIWantToMock()).Returns(new SpecialObject(true));
   var classIWantToTest = new ClassIWantToTest(_mockObject.Object);
   classIWantToTest.RunCode();
   ...
}
生产代码:

public class ClassIWantToTest {
    IMyInterface _client;
    internal ClassIWantToTest(IMyInterface client) {
        _client = client;
    }
    public bool RunCode() {
        SpecialObject so = _client.FunctionIWantToMock();
        return so.Value; // This line is the problem
        ...
    }
}

问题是,当我运行测试时,模拟函数没有返回我在设置函数中设置的内容,它没有返回
SpecialObject(true)
,而是返回
null
。然后我得到一个空引用异常。当我调试测试时,我不能进入
\u客户端。functioniWantomock
调用,它只是立即进入下一行,并用null填充
so

因为这没有什么意义,我想试试这样的方法:

[Fact]
public void ItReturnsTheRightThing() {
    _mockObject = new Mock<IMyInterface>();
   _mockObject.SetUp(o => o.FunctionIWantToMock()).Returns(new SpecialObject(true));
   var classIWantToTest = new ClassIWantToTest(_mockObject.Object);
   classIWantToTest.RunCode();
  ...
}
[事实]
公共无效ITReturnsRightThings(){
_mockObject=newmock();
_SetUp(o=>o.FunctionIWantToMock()).Returns(newspecialObject(true));
var classiswanttotest=新的classiswanttotest(_mockObject.Object);
ClassWantTest.RunCode();
...
}

试试这个,如果它起作用的话,就有东西干扰了介于两者之间的模拟对象。一位同事帮我解决了这个问题。这也是我的错,我在写这个问题时混淆了太多的原始代码

问题在于,我在设置期间将显式参数传递给了
o.FunctionIWantToMock()
方法,该方法与在业务逻辑中传递给函数的显式参数不匹配。因此,实际的测试代码是
o.FunctionIWantToMock(“foo”,“bar”)
。在我的业务逻辑中,实际函数是通过
\u client.FunctionIWantToMock(“Foo”,“Bar”)
调用的。因此,因为参数不匹配(“Foo”vs“Foo”,“Bar”vs“Bar”),所以设置实际上并没有设置我的实际代码。我将设置功能更改为


o.FunctionIWantToMock(It.IsAny(),It.IsAny())

@Fabio当我输入这个问题时,这只是一个输入错误,我会更改它。@Fabio我在尝试访问
so
变量的属性时遇到空引用异常
因此
本身是空的,因为调用
\u client.FunctionIWantToMock()
出于某种原因返回空值。但是我上面的代码做了同样的事情,除了在构造函数中创建模拟对象之外
[Fact]
public void ItReturnsTheRightThing() {
    _mockObject = new Mock<IMyInterface>();
   _mockObject.SetUp(o => o.FunctionIWantToMock()).Returns(new SpecialObject(true));
   var classIWantToTest = new ClassIWantToTest(_mockObject.Object);
   classIWantToTest.RunCode();
  ...
}