65.9K
CodeProject 正在变化。 阅读更多。
Home

Prolific:使用 Jasmine 进行测试的新方法

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2014年7月4日

CPOL

2分钟阅读

viewsIcon

8780

downloadIcon

57

让我们看看如何使用 Prolific 来编写更好、更有效的 Jasmine 测试

引言

我想向您介绍 Prolific,这是一个与 Jasmine 共存的 javascript 库。
您可以在这里找到它:https://github.com/Bitterbrown/prolific

它允许您编写更简洁、更易读的 测试,并节省时间避免重复。它易于使用,只需在 jasmine js 文件(和 jquery)之后包含该库,您就可以开始了。

使用“原始”Jasmine 的问题

在测试行为时,通常需要在测试中编写多行代码,只是为了打开一个模态窗口或侧边栏。当新开发人员查看您的测试时,他很难理解行为流程。

让我们以这个 Jasmine 测试为例

describe "Logged in user", ->

  it "should have a logged in user", ->
    myapp.navigate "logout"
    myapp.doLogin userFixture
    myapp.restart()
    myapp.navigate "start-page"

    expect(myapp.currentUser.name).toBe userFixture.name

  it "app should show user icon", ->
    expect($("header .user-icon").size()).toBeGreaterThan 0

  it "should open the left user panel when user icon is clicked", ->
    $("header .user-icon").click()
    
    waits 500

    runs ->
      expect($("body .left-region .user-panel").is(":visible")).toBeThruthy()

现在想象一下,您需要测试没有登录用户时的应用程序。

describe "Logged out user", ->

  it "should not have a logged in user", ->
    myapp.navigate "logout"
    delete myapp.currentUser
    myapp.restart()
    myapp.navigate "start-page"

    expect(myapp.currentUser).toBeUndefined()


  it "app should not show user icon", ->
    expect($("header .user-icon").size()).toBe 0

问题

任何阅读此测试以更好地理解应用程序的人都将难以从代码中提取上下文,它不够流畅和全面。

如何解决问题

需要提高这些测试套件的可读性,使其尽可能简短并更具描述性

将 Prolific 添加到您的 Jasmine 套件

Prolific 的目标正是解决刚刚展示的问题。让我们尝试使用 assume 方法重写这些测试,该方法由 Prolific 暴露

describe "Logged in user", ->

  it "app should show user icon", ->
    assume "app has user paolo,moretti logged in"
    
    assume "$ header .user-icon is an element and var myapp.currentUser.name is 'paolo'"

  it "should open the left user panel when user icon is clicked", ->
    assume "on click .user-icon then in .5 seconds $ .left-region .user-panel is :visible"

让我们测试注销后的行为

describe "Logged out user", ->

  it "app should not show user icon", ->
    assume "app has no user logged in"
    
    assume "$ header .user-icon isnt an element and myapp.currentUser.name is undefined"

如您所见,测试现在更短且更易读。

概述

assume "app has user paolo,moretti logged in"
assume "app has no user logged in"

在 Prolific 中,这称为 routine(例程)例程用于避免代码重复,基本上是一个在外部定义的正则表达式,它响应用户输入以为您设置上下文行为。

assume "$ header .user-icon is an element and var myapp.currentUser.name is 'paolo'"
assume "on click .user-icon then in .5 seconds $ .left-region .user-panel is :visible" 

这就是 sentences(句子) 的概念。

  • 每个 assume 调用都提供一个或多个 句子(由“and”连接)
  • 然后解析每个句子以查找 matchers(匹配器),用于了解您想要运行的测试类型。
  • 每个匹配器将解析文本以查找 getters(获取器),即要评估的变量

请查看仓库以获取全面的文档
https://github.com/Bitterbrown/prolific

© . All rights reserved.