目前,我开始将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()方法会发生什么?