如何使用Moq.setup返回字符串



嗨,我已经创建了一个类,它有一个返回字符串"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

谁能帮我解决这个问题,使这个单元测试通过。

谢谢你的帮助。

您还没有为模拟字段赋值。在您的测试中添加以下行:

Mock<Class1> mock = new Mock<Class1>()

无论如何你都不能模拟那个方法,因为它不是虚的。在一个不可重写的成员上无效的设置:x =>x.GetByTitle("asdf"

最后,您设置的行为仅适用于使用mock.Object属性从mock中检索的实例,而不适用于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);
    }
}

我看不到任何Mock<Class1> mock = new Mock<Class1>()。可能它丢失了,因此导致NullReferenceException。

其次,用Moq模拟非虚方法是不可能的。所以你的类应该是这样的。

public class Class1
{
    public virtual string GetHelloWorld()
    {
        return "HelloWorld";
    }
}

但我也不太确定你想做什么…当最终在实际实现中调用该方法时,为什么要设置模拟呢?

相关内容

  • 没有找到相关文章

最新更新