测试chrome扩展 - 需要错误

时间:2016-11-24 22:24:03

标签: google-chrome-extension gulp requirejs mocha mocha-phantomjs

我有gulp任务:

gulp.task('test', function () {
    return gulp.src('test/runner.html')
        .pipe(mochaPhantomJS());
});

这是我的runner.html

<!DOCTYPE html>
<html>
    <head>
        <title>Mocha</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="../node_modules/mocha/mocha.css" />
    </head>
    <body>
        <script src="../node_modules/mocha/mocha.js"></script>
        <script>mocha.setup('bdd')</script>
        <script src="../node_modules/chai/chai.js"></script>
        <script src="../node_modules/requirejs/require.js"></script>

        <script>
          var assert = chai.assert;
          var expect = chai.expect;
          var should = chai.should();
        </script>
        <script src="spec/test.js"></script>
        <script>
            if (window.mochaPhantomJS) {
              console.log('Running mochaPhantomJS...');
              mochaPhantomJS.run();
            } else {
              console.log('Running mocha...');
              mocha.run();
            }
        </script>
    </body>
</html>

这是我的test.js文件:

var chrome = require('sinon-chrome');
var popup = require('../../source/scripts/popup');

describe('sumit', function(){
    before(function () {
        global.chrome = chrome;
    });
    it('Should return 1', function(){
        assert(popup.sum(0,1) === 1);
    });
})

但是当我运行gulp test时,我收到以下错误消息:

  

错误:模块名称&#34; sinon-chrome&#34;尚未加载上下文:_。使用require([])

     

http://requirejs.org/docs/errors.html#notloaded

     

在defaultOnError中   文件:/// C:/dev/extensions/NEW_EXPRESS/node_modules/requirejs/require.js:1   in onError at   文件:/// C:/dev/extensions/NEW_EXPRESS/node_modules/requirejs/require.js:547   在localRequire中   文件:/// C:/dev/extensions/NEW_EXPRESS/node_modules/requirejs/require.js:1433   在requirejs中   文件:/// C:/dev/extensions/NEW_EXPRESS/node_modules/requirejs/require.js:1794

2 个答案:

答案 0 :(得分:1)

link in the error message中,它意味着您应该使用异步public static final String DATABASE_NAME = "contact"; //database name public static final int DATABASE_VERSION = 1; //database version public static final String TABLE_CONTACTS = "contacts";//table name public static final String KEY_ID = "id"; //column names for contacts table public static final String KEY_NAME = "name"; public static final String KEY_MOBILE = "mobile"; public static final String KEY_HOME = "home"; public static final String KEY_OFFICE = "office"; public static final String KEY_ADDRESS = "address"; public static final String KEY_EMAIL = "email"; public static final String KEY_COMPANYNAME = "companyName"; public static final String KEY_JOBROLE = "jobRole"; public DbHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } //to create taables @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," + KEY_MOBILE + " TEXT," + KEY_HOME + " TEXT," + KEY_OFFICE + " TEXT," + KEY_ADDRESS + " TEXT," + KEY_EMAIL + " TEXT," + KEY_COMPANYNAME + " TEXT," + KEY_JOBROLE + " TEXT" + ")"; sqLiteDatabase.execSQL(CREATE_CONTACTS_TABLE); } //upgrading database i.e., if further we add any columns to the existing table ,it will modify automatically @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { sqLiteDatabase.execSQL("DROP TABLE IF EXISTS" + TABLE_CONTACTS); //drop older table if exists onCreate(sqLiteDatabase); //to create table again } public boolean addContact(Contacts contacts) { SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(KEY_NAME,contacts.getName()); contentValues.put(KEY_MOBILE,contacts.getMobile()); contentValues.put(KEY_HOME,contacts.getHome()); contentValues.put(KEY_OFFICE,contacts.getOffice()); contentValues.put(KEY_ADDRESS,contacts.getAddress()); contentValues.put(KEY_EMAIL,contacts.getEmail()); contentValues.put(KEY_COMPANYNAME,contacts.getCompanyName()); contentValues.put(KEY_JOBROLE,contacts.getJobRole()); sqLiteDatabase.insert(TABLE_CONTACTS,null,contentValues); sqLiteDatabase.close(); return true; } public Contacts getContact(int id) { SQLiteDatabase sqLiteDatabase =this.getReadableDatabase(); Cursor cursor = sqLiteDatabase.query(TABLE_CONTACTS,new String[] {KEY_ID,KEY_NAME,KEY_MOBILE,KEY_HOME,KEY_OFFICE,KEY_ADDRESS,KEY_EMAIL,KEY_COMPANYNAME,KEY_JOBROLE},KEY_ID + "=?",new String[] {String.valueOf(id)},null,null,null,null); if(cursor != null) cursor.moveToFirst(); Contacts contacts = new Contacts(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2),cursor.getString(3),cursor.getString(4),cursor.getString(5),cursor.getString(6),cursor.getString(7),cursor.getString(8)); return contacts; } public List<Contacts>getAllContacts() { List<Contacts> contactsList = new ArrayList<Contacts>(); String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); Cursor cursor = sqLiteDatabase.rawQuery(selectQuery,null); if (cursor.moveToFirst()){ do { Contacts contacts = new Contacts(); contacts.setId(Integer.parseInt(cursor.getString(0))); contacts.setName(cursor.getString(1)); contacts.setMobile(cursor.getString(2)); contacts.setHome(cursor.getString(3)); contacts.setOffice(cursor.getString(4)); contacts.setAddress(cursor.getString(5)); contacts.setEmail(cursor.getString(6)); contacts.setCompanyName(cursor.getString(7)); contacts.setJobRole(cursor.getString(8)); contactsList.add(contacts); }while (cursor.moveToNext()); } return contactsList; } public int getContactsCount() { String countQuery = " SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase sqLiteDatabase = this.getReadableDatabase(); Cursor cursor = sqLiteDatabase.rawQuery(countQuery,null); cursor.close(); return cursor.getCount(); } public boolean updateContact(Contacts contacts) { SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(KEY_NAME,contacts.getName()); contentValues.put(KEY_MOBILE,contacts.getMobile()); contentValues.put(KEY_HOME,contacts.getHome()); contentValues.put(KEY_OFFICE,contacts.getOffice()); contentValues.put(KEY_ADDRESS,contacts.getAddress()); contentValues.put(KEY_EMAIL,contacts.getEmail()); contentValues.put(KEY_COMPANYNAME,contacts.getCompanyName()); contentValues.put(KEY_JOBROLE,contacts.getJobRole()); sqLiteDatabase.update(TABLE_CONTACTS,contentValues,KEY_ID + "= ?",new String[] {String.valueOf(contacts.getId())}); return true; } public void deleteContact(Contacts contacts) { SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); sqLiteDatabase.delete(TABLE_CONTACTS,KEY_ID + "= ?",new String[]{String.valueOf(contacts.getId())}); sqLiteDatabase.close(); } 方法。

因此,如果您将require更新为以下内容,则应解决该问题:

test.js

答案 1 :(得分:0)

在Angular 7构建中,您可以执行此操作。

Karma.config:

config.set({
        basePath: '',
        frameworks: ['jasmine', '@angular-devkit/build-angular'],
        plugins: [
            require('karma-jasmine'),
            require('karma-chrome-launcher'),
            require('karma-jasmine-html-reporter'),
            require('karma-coverage-istanbul-reporter'),
            require('@angular-devkit/build-angular/plugins/karma')
        ],
        client: {
            clearContext: false // leave Jasmine Spec Runner output visible in browser
        },
        coverageIstanbulReporter: {
            dir: require('path').join(__dirname, '../coverage'),
            reports: ['html', 'lcovonly'],
            fixWebpackSourcePaths: true
        },
        reporters: ['kjhtml', 'progress'],
        port: 9876,
        colors: true,
        logLevel: config.LOG_INFO,
        autoWatch: true,
        browsers: ['Chrome'],
        singleRun: false           
    });

并在您的测试中:

import * as chrome from 'sinon-chrome';
import {MyService} from '../my.service';

describe('RunTaskService', () => {
    beforeEach(() => {
      TestBed.configureTestingModule({});
      (global as any).chrome = chrome;
    });
    it('should be start a task', done => {
        const service: MyService = TestBed.get(MyService);
        expect(service).toBeTruthy();

        chrome.runtime.lastError = null;
        chrome.tabs.query.yields([{url: 'https://cnn.com', id: 123}]);

        // call your code to test. the chrome.tabs.query will
        // return [{url: 'https://cnn.com', id: 123}]

    });