【问题标题】:How to return string using Moq.setup如何使用 Moq.setup 返回字符串
【发布时间】:2014-03-28 12:26:54
【问题描述】:

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

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

感谢您对此的帮助。

【问题讨论】:

    标签: moq


    【解决方案1】:

    您尚未为模拟字段分配值。将以下行添加到您的测试中。

    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);
    
        }
    }
    

    【讨论】:

    • 嗨乔,感谢您的回复,我现在可以模拟这个方法了。
    【解决方案2】:

    我看不到任何Mock&lt;Class1&gt; mock = new Mock&lt;Class1&gt;()。也许它丢失了,因此导致 NullReferenceException。

    其次,不可能使用 Moq 模拟非虚拟方法。 所以你的班级需要看起来像这样。

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

    但我也不确定你想要做什么...... 为什么最终在实际实现上调用方法时要设置模拟?

    【讨论】:

    • 我写了一个 wcf 服务,服务方法会调用一个方法来获取当前的用户名,我想模拟这个方法总是返回我的用户名。所以当我调用 Operation1() 时将调用此方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2019-12-06
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多