我知道我如何使用这些术语,但我想知道是否有单独测试的伪造,模拟和存根的可接受定义?你如何为你的测试定义这些?描述您可能使用每种情况的情况.
以下是我如何使用它们:
假:一个实现接口但包含固定数据而没有逻辑的类.根据实施情况,简单地返回"好"或"坏"数据.
Mock:一个实现接口的类,允许动态设置值以返回/异常从特定方法抛出,并提供检查是否已调用/未调用特定方法的功能.
存根:类似于模拟类,但它不提供验证方法是否已被调用/未调用的能力.
模拟和存根可以由模拟框架手动生成或生成.伪造的类是手工生成的.我主要使用模拟来验证我的类和依赖类之间的交互.一旦我验证了交互并且正在通过我的代码测试备用路径,我就会使用存根.我主要使用假类来抽象出数据依赖性,或者每次使用模拟/存根都太繁琐.
我想为Web服务编写单元测试.我创建我的测试项目,引用我的web项目(不是服务引用,程序集引用),然后编写一些代码来测试Web服务 - 它们工作正常.但是,有一些服务可确保用户使用登录Web应用程序HttpContext.Current.User.Identity.IsAuthenticated
.
在测试的上下文中,没有HttpContext这样的东西,所以测试总是失败.这些Web服务应该如何进行单元测试?
我有一个包含这样的资源工厂的服务:
serviceModule.factory('ProjectResource', ['$resource', function($resource){
return $resource('/projects/:id.json', {}, {
'query': {method: 'GET', isArray: true}}
);
}]);
Run Code Online (Sandbox Code Playgroud)
在一个驻留在控制器中的表单中,我注入了serviceModule,然后创建了一个资源对象的新实例:
$scope.project = new ProjectResource({name: 'Enter a name'})
Run Code Online (Sandbox Code Playgroud)
我有一些嘲弄它的问题.我试过像这样创建一个模拟对象,并将其注入控制器:
mockProjectResource = {
query: function(){
deferred = $q.defer();
deferred.resolve({id: 1, :name:'test'});
return deferred.promise;
}
};
Run Code Online (Sandbox Code Playgroud)
无论单元测试,我都会收到错误:
TypeError: undefined is not a function
Run Code Online (Sandbox Code Playgroud)
这指向Project Resource对象($scope.project = new ProjectResource({name: 'Enter a name'})
)的初始化.
有没有什么好方法来嘲笑new ProjectResource(...)
?
我最近对测试非常感兴趣,我现在正努力学习以最佳方式进行单元测试.我和Ninoit一起使用Rhino Mocks.我在Stackoverflow上也经常阅读,但还没有找到我的问题的明确答案.
我想知道如果我有一个类似下面的方法,我应该模拟OfficeClass依赖项并测试GetAllOffices或仅使用存根来获取依赖关系并验证方法GetAllOffices已被调用,我确实得到了办公室,我从我的存根设置预期?
public Offices GetAllOffices()
{
try
{
var offices = officeClass.GetAllOffices();
return offices;
}
}
Run Code Online (Sandbox Code Playgroud)
如果OfficeClass只是另一个POCO,或者是否因为嘲弄和存根而被称为网络服务,它会有什么不同吗?
长问题简介:何时进行模拟以及何时进行单元测试中的Stub?
我在单元测试中使用Rhino Mocks.
我想知道STUBS和MOCKS(mocks.Stub<T>()
和 mocks.StrictMock<T>()
)之间的区别.
unit-testing ×5
mocking ×4
stub ×3
angularjs ×1
asp.net ×1
c# ×1
definition ×1
httpcontext ×1
terminology ×1