c# – 如何在我的单元测试中使用Mock Objects,仍然使用Code Coverage?

c# – 如何在我的单元测试中使用Mock Objects,仍然使用Code Coverage?,第1张

概述目前,我开始将Mock对象的概念引入到我的单元测试中.特别是我正在使用Moq框架.然而,我注意到的一件事是突然间,我使用这个框架测试的类显示的代码覆盖率为0%. 现在我明白,因为我只是嘲笑课堂,它不运行实际的类本身….但是我如何编写这些测试,并且代码覆盖率返回准确的结果?我必须编写一套使用Mocks和一组才能直接实例化的测试. 也许我没有意识到做错事了吗? 以下是我尝试单元测试一个名为“MyCla 目前,我开始将Mock对象的概念引入到我的单元测试中.特别是我正在使用Moq框架.然而,我注意到的一件事是突然间,我使用这个框架测试的类显示的代码覆盖率为0%.

现在我明白,因为我只是嘲笑课堂,它不运行实际的类本身….但是我如何编写这些测试,并且代码覆盖率返回准确的结果?我必须编写一套使用Mocks和一组才能直接实例化的测试.

也许我没有意识到做错事了吗?

以下是我尝试单元测试一个名为“MyClass”的类的例子:

using Moq;using NUnitFramework;namespace MynameSpace{    [TestFixture]    public class MyClasstests    {        [Test]        public voID TestGetSomeString()        {            const string EXPECTED_STRING = "Some String!";            Mock<MyClass> myMock = new Mock<MyClass>();            myMock.Expect(m => m.GetSomeString()).Returns(EXPECTED_STRING);            string someString = myMock.Object.GetSomeString();            Assert.AreEqual(EXPECTED_STRING,someString);            myMock.VerifyAll();        }    }    public class MyClass    {        public virtual string GetSomeString()        {            return "Hello World!";        }    }}

有人知道我应该做的不同吗?

解决方法 你没有正确使用你的模拟对象.当您使用模拟对象时,您的意图是测试代码如何与其他对象进行交互,而无需实际使用真实对象.请参阅以下代码:
using Moq;using NUnitFramework;namespace MynameSpace    {        [TestFixture]        public class MyClasstests        {            [Test]            public voID TestGetSomeString()            {                const string EXPECTED_STRING = "Some String!";                Mock<IDependance> myMock = new Mock<IDependance>();                myMock.Expect(m => m.GiveMeAString()).Returns("Hello World");                MyClass myobject = new MyClass();                string someString = myobject.GetSomeString(myMock.Object);                Assert.AreEqual(EXPECTED_STRING,someString);                myMock.VerifyAll();            }        }        public class MyClass        {            public virtual string GetSomeString(IDependance objectThatITalkTo)            {                return objectThatITalkTo.GiveMeAString();            }        }        public interface IDependance        {            string GiveMeAString();        }    }

当代码只是返回一个没有任何逻辑的字符串时,它看起来不像任何有用的东西.

如果您的GetSomeString()方法执行一些逻辑可能会根据IDependdance .GiveMeAString()方法返回的结果更改输出字符串的结果,那么实际的权力就来了,那么你可以看到你的方法如何处理从IDependdance发送的错误数据接口.

就像是:

public virtual string GetSomeString(IDependance objectThatITalkTo {     if (objectThatITalkTo.GiveMeAString() == "Hello World")     return "Hi"; }

现在如果你在测试中有这样一行:

myMock.Expect(m => m.GiveMeAString()).Returns(null);

您的GetSomeString()方法会发生什么?

总结

以上是内存溢出为你收集整理的c# – 如何在我的单元测试中使用Mock Objects,仍然使用Code Coverage?全部内容,希望文章能够帮你解决c# – 如何在我的单元测试中使用Mock Objects,仍然使用Code Coverage?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1236203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存