您好我创建了一个具有返回字符串“HelloWorld”
的方法的类这是代码
public class Class1
{
public string GetHelloWorld()
{
return "HelloWorld";
}
}
我编写了一个NUnit测试用例,想要模拟此方法的返回字符串,如下所示
public class UnitTest1
{
Mock<Class1> mock;
[Test]
public void TestMethod1()
{
string expected = "Hi";
mock.Setup(m => m.GetHelloWorld()).Returns(()=>"Hi");
Class1 obj = new Class1();
string x=obj.GetHelloWorld();
Assert.AreEqual("Hi", x);
}
}
当我使用Nunit运行时,我在第15行收到错误为“对象引用未设置为对象的实例”,这是mock.setup
任何人都可以帮我解决这个问题,让这个单元测试通过。
感谢您的帮助。
答案 0 :(得分:2)
您还没有为模拟字段分配值。在测试中添加以下行。
Mock<Class1> mock = new Mock<Class1>()
无论如何你都无法模仿这种方法,因为它不是虚拟的。有关详细信息,请参阅此问题:Moq: Invalid setup on a non-overridable member: x => x.GetByTitle("asdf")
最后,您设置的行为仅适用于您使用mock.Object
属性从模拟中检索的实例,而不适用于Class1
的正常实例。因此,如果您实例化new Class1()
,则无法获得模拟行为。
总之,您的代码必须看起来更像这样:
public class Class1
{
public virtual string GetHelloWorld()
{
return "HelloWorld";
}
}
public class UnitTest1
{
[Test]
public void TestMethod1()
{
//arrange
Mock<Class1> mock = new Mock<Class1>();
mock.Setup(m => m.GetHelloWorld()).Returns(()=> "Hi");
Class1 obj = mock.Object;
//act
string x = obj.GetHelloWorld();
//assert
Assert.AreEqual("Hi", x);
}
}
答案 1 :(得分:0)
我看不到任何Mock<Class1> mock = new Mock<Class1>()
。也许它丢失了,因此导致了NullReferenceException。
其次,用Moq模拟非虚方法是不可能的。 所以你的班级需要看起来像这样。
public class Class1
{
public virtual string GetHelloWorld()
{
return "HelloWorld";
}
}
但我也不确定你要做什么...... 为什么在最后调用真实实现的方法时设置模拟?