【发布时间】:2014-05-20 23:26:12
【问题描述】:
在这方面需要一些建议...我是模拟东西的新手,正在编写一些 MOQ 测试...我在一个我必须测试的界面上磕磕绊绊:
假设我有这个界面:
interface IAWClient
{
void Login( string );
}
我已经这样写了我的 MOQ 测试......
最小起订量测试 1:
[Test]
public void LoginTest()
{
Mock<IAWClient> m = new Mock<IAWClient>();
m.Setup(x => x.Login("Joe"));
m.Object.Login("Joe"); <<-- this is the line I am interested in
}
但是已经看到了许多使用具体类来测试接口的示例......例如:
public class AdmissionMngr
{
IAWClient m_IAWClient;
public AdmissionMngr( IAWClient iaw )
{
m_IAWClient = iaw;
}
public void Admit(string name)
{
m_IAWClient.Login(name);
}
}
使用这样的模拟测试:
最小起订量测试 2:
[Test]
public void LoginTest()
{
Mock<IAWClient> m = new Mock<IAWClient>();
m.Setup(x => x.Login("Joe"));
AdmissionMngr admin = new AdmissionMngr(m.Object);
admin.Admit("Joe"); <<-- this is the line I am interested in
}
对于指示的两行... MOQ 测试 1 和 MOQ 测试 2 是否等效? 为什么或为什么不?
非常感谢!
【问题讨论】:
-
嗯,在这两种情况下,在模拟上调用的方法是相同的。两者最终都使用字符串
"Joe"调用Login方法一次。您可以通过使用调试器运行两者来查看这一点。您使用哪一种取决于您要测试的内容。例如,后者可能是测试AdminMngr类的好方法。第一个测试似乎毫无用处;您正在创建一个模拟并告诉它期待某个方法调用,然后自己显式地执行该方法调用。这总是会成功的,不会告诉你任何事情。 -
模拟就像一个被掏空的类,它去掉了里面所有的逻辑。您不想测试模拟。如果这样做,您将测试 Moq 的行为方式,而不是您的班级。