Javascript 使用RhinoMock或Moq测试方法的内部构件
对于这种嘲弄的事情,我还很陌生,我有几个问题要问 如果我错了,请纠正我: 模拟不会初始化实际方法,即模拟不会实际调用类的构造函数。相反,它做的事情类似于查看类的签名并创建一个具有该签名但没有任何方法功能的对象。如果您只需要该类型的对象,但不想测试其内部结构,例如,如果您实际测试的对象对其具有依赖性,则这非常有用Javascript 使用RhinoMock或Moq测试方法的内部构件,javascript,unit-testing,mocking,rhino-mocks,moq,Javascript,Unit Testing,Mocking,Rhino Mocks,Moq,对于这种嘲弄的事情,我还很陌生,我有几个问题要问 如果我错了,请纠正我: 模拟不会初始化实际方法,即模拟不会实际调用类的构造函数。相反,它做的事情类似于查看类的签名并创建一个具有该签名但没有任何方法功能的对象。如果您只需要该类型的对象,但不想测试其内部结构,例如,如果您实际测试的对象对其具有依赖性,则这非常有用 我正在尝试测试一个方法的内部,这是否意味着我必须创建该方法所属类的实例?摘要:动态模拟不会帮助您测试类型的内部,但您首先不应该尝试这样做 你的描述基本上是正确的,但要比这复杂一点。本质
我正在尝试测试一个方法的内部,这是否意味着我必须创建该方法所属类的实例?摘要:动态模拟不会帮助您测试类型的内部,但您首先不应该尝试这样做
你的描述基本上是正确的,但要比这复杂一点。本质上,动态模拟不会做任何手动无法完成的事情 假设您正在针对这样一个接口进行编程:
public interface IMyInterface
{
string Foo(string s);
}
public class MyBase
{
public virtual string Ploeh()
{
return "Fnaah";
}
}
您可以手动创建IMyInterface的特定于测试的实现,该实现忽略输入参数并始终返回相同的输出:
public class MyClass : IMyInterface
{
public string Foo(string s)
{
return "Bar";
}
}
但是,如果您想测试消费者如何响应不同的返回值,那么重复性会变得非常快,因此,您可以使用一个框架动态地为您创建测试,而不是手动编写测试双倍
假设dynamic mock真的编写了与上面MyClass实现类似的代码(他们实际上并没有编写代码,而是动态地发出类型,但这是一个足够准确的类比)
以下是如何使用Moq定义与MyClass相同的行为:
var mock = new Mock<IMyInterface>();
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar");
通过手动,您可以从MyBase派生并重写Ploeh方法,因为它是虚拟的:
public class TestSpecificChild : MyBase
{
public override string Ploeh()
{
return "Ndøh";
}
}
动态模拟库也可以这样做,抽象方法也是如此。在本例中,将调用基类的构造函数,因为.NET就是这样工作的
但是,您不能编写重写非虚拟或内部成员的代码,动态模拟也不能。他们只能做你能用手做的事
不过,有一条建议:只有通过公共API进行单元测试的内部成员才可以
警告:上述描述适用于大多数动态模拟,但TypeMock除外,TypeMock不同且。。。可怕。一个你正在做的事情和你试图实现的目标的代码示例会有所帮助