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