需要一点建议...我是嘲笑东西的新手,我正在编写一些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 Test 1和MOQ Test 2等效? 为什么或为什么不呢?
非常感谢你!
答案 0 :(得分:3)
这就是依赖注入的样子。您正在测试AdmissionMngr
,但要确保您不测试该经理使用的IAWClient
,您可以创建模拟IAWClient
实施(使用模拟框架)并通过它作为对象构造函数的依赖。
关于您发布的代码:
第一个实际测试模拟对象,因此它没有意义。第二个测试AdmissionMngr
,其依赖性被模拟,这在单元测试中是非常常见的做法。
答案 1 :(得分:2)
你的嘲讽存在注入其他测试案例。你不会测试你的嘲笑......他们总会产生你告诉他们制作的东西(你的第一个例子就是这样)。
当你嘲笑某事时 - 它没有受到考验。您可以使用mock来测试需要该类型的对象才能运行的其他东西。你可以让它提供一些预期的输入,但另一个对象应该根据它产生一些预期的输出。
所以,你的第二个例子是要走的路。