【发布时间】:2013-05-23 16:29:28
【问题描述】:
我正在我的网络应用程序中使用Jasmine 进行一些测试。我正在使用Coffeescript 来编写我的模型、服务和视图模型。
class MyViewModel
constructor: ( @options ) ->
@alert = new Alert
elementId: 'my-alert-element-id'
@service = new MyService
alertId: @alert.elementId
现在我用 jasmine 写一个测试
describe 'MyViewModel', ->
sut = null
beforeEach ->
sut = new MyViewModel()
afterEach ->
sut = null
describe 'constructor()', ->
it 'creates a new instance of the ViewModel', ->
expect( sut ).not.toBeNull()
所以这里的问题是我的viewModel 依赖于alert 和service。这使得测试的编写和维护很烦人。
是否有用于 Javascript 中的依赖注入的库。我使用了几个.net 库,例如castle windsor 和ninject。
或者我应该只是采用某种类型模式。我应该说我正在使用knockout,当我在实际应用程序中使用视图模型时,它看起来像这样。
<script type="text/javascript">
$(function () {
var viewModel = new MyViewModel();
ko.applyBindings(viewModel);
});
</script>
我不会创建自己的对象,而是向注入框架询问 MyViewModel 我假设的实例。
我正在寻找有关采用哪种模式或库的建议,以使我的测试更容易一些,并帮助我的 javascript 类彼此分离。
我找到的库:
编辑:我最终做了什么
- 我采用了 RequireJs 并将我的所有对象移动到 AMD 样式模块中
- 我使用 Jamine 运行测试
- 我使用 Sinon 创建模拟和存根
- 我使用 Squire 将模拟和存根注入到我的测试系统中
查看测试文件的coffeescript示例
define ['squire', 'sinon' ], ( squire, sinon ) ->
describe '==== a view model ====', ->
sut = null
testContext = null
beforeEach ->
testContext =
squireInjector: new squire
stubService: sinon.stub()
stubJquery: sinon.stub()
someCallbackSpy: sinon.spy()
testContext.squireInjector.mock(
'jquery', squire.Helpers.returns( stubJquery ) )
testContext.squireInjector.require ['aViewModel'], ( viewModel ) =>
sut = new viewModel
service: testContext.stubService
someCallback: testContext.someCallbackSpy
waitsFor( -> sut? )
afterEach ->
sut = null
testContext = null
describe 'the constructor method should', ->
it 'create a new instance of the view
model and have required dependencies', ->
expect( sut ).toBeDefined
expect( sut.service ).toBeDefined
expect( sut.someCallback ).toBeDefined
describe 'the next method should', ->
it 'increment the route id by one', ->
# Arrange
sut.routeId = 5
# Act
sut.next()
# Assert
expect( sut.routeId ).toEqual( 6 )
expect( testContext.someCallbackSpy.called ).toBe(true)
【问题讨论】:
-
写得好!谢谢
-
Jasmine 还支持创建模拟和存根。诗浓有什么具体原因吗?
标签: javascript unit-testing dependency-injection coffeescript jasmine