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

时间:2014-03-28 12:26:55

标签: moq

您好我创建了一个具有返回字符串“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

任何人都可以帮我解决这个问题,让这个单元测试通过。

感谢您的帮助。

2 个答案:

答案 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";
    }
}

但我也不确定你要做什么...... 为什么在最后调用真实实现的方法时设置模拟?