Spec cleanup and fixes (#366)

* Merge duplicated tests in package.spec into one

* Let Jasmine handle promises in tests

* fix: return unhandled promises in spec

* Don't use `done` for synchronous tests
diff --git a/spec/e2e/endtoend.spec.js b/spec/e2e/endtoend.spec.js
index 37a6048..b33e013 100644
--- a/spec/e2e/endtoend.spec.js
+++ b/spec/e2e/endtoend.spec.js
@@ -116,7 +116,7 @@
 
         // "InProcessServer extension"
 
-        it('spec.5a should build project containing plugin with InProcessServer extension', function (done) {
+        it('spec.5a should build project containing plugin with InProcessServer extension', function () {
             var extensionsPluginInfo, api;
 
             extensionsPluginInfo = new PluginInfo(extensionsPlugin);
@@ -125,20 +125,10 @@
             api.locations.root = path.join(buildDirectory, projectFolder);
             api.locations.www = path.join(buildDirectory, projectFolder, 'www');
 
-            var fail = jasmine.createSpy('fail')
-                .and.callFake(function (err) {
-                    console.error(err);
-                });
-
-            api.addPlugin(extensionsPluginInfo)
+            return api.addPlugin(extensionsPluginInfo)
                 .then(function () {
                     shell.exec(buildScriptPath, { silent: silent });
                     _expectSubdirAndFileExist('CordovaApp.Windows10_1.0.0.0_anycpu_debug_Test', 'CordovaApp.Windows10_1.0.0.0_anycpu_debug.appx');
-                })
-                .catch(fail)
-                .finally(function () {
-                    expect(fail).not.toHaveBeenCalled();
-                    done();
                 });
         });
 
@@ -231,7 +221,7 @@
 
         // "InProcessServer extension"
 
-        it('spec.5b should build project (8.1) containing plugin with InProcessServer extension', function (done) {
+        it('spec.5b should build project (8.1) containing plugin with InProcessServer extension', function () {
             var extensionsPluginInfo, api;
 
             extensionsPluginInfo = new PluginInfo(extensionsPlugin);
@@ -240,21 +230,11 @@
             api.locations.root = path.join(buildDirectory, projectFolder);
             api.locations.www = path.join(buildDirectory, projectFolder, 'www');
 
-            var fail = jasmine.createSpy('fail')
-                .and.callFake(function (err) {
-                    console.error(err);
-                });
-
-            api.addPlugin(extensionsPluginInfo)
+            return api.addPlugin(extensionsPluginInfo)
                 .then(function () {
                     shell.exec(buildScriptPath + ' --appx=8.1', { silent: silent });
                     _expectExist(/.*Windows.*\.appxupload/);
                     _expectExist(/.*Phone.*\.appxupload/);
-                })
-                .catch(fail)
-                .finally(function () {
-                    expect(fail).not.toHaveBeenCalled();
-                    done();
                 });
         });
 
diff --git a/spec/unit/ConfigChanges.spec.js b/spec/unit/ConfigChanges.spec.js
index 022b696..6e0a8ed 100644
--- a/spec/unit/ConfigChanges.spec.js
+++ b/spec/unit/ConfigChanges.spec.js
@@ -119,13 +119,8 @@
         return appxmanifest.getCapabilities();
     }
 
-    var fail = jasmine.createSpy('fail')
-        .and.callFake(function (err) {
-            console.error(err);
-        });
-
-    it('should be removed using overriden PlatformMunger', function (done) {
-        api.addPlugin(dummyPluginInfo)
+    it('should be removed using overriden PlatformMunger', function () {
+        return api.addPlugin(dummyPluginInfo)
             .then(function () {
                 //  There is the one default capability in manifest with 'internetClient' name
                 expect(getManifestCapabilities(windowsManifest).length).toBe(getPluginCapabilities(dummyPluginInfo).length + 1);
@@ -133,16 +128,11 @@
             })
             .then(function () {
                 expect(getManifestCapabilities(windowsManifest).length).toBe(1);
-            })
-            .catch(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('should be added with uap prefixes when install plugin', function (done) {
-        api.addPlugin(dummyPluginInfo)
+    it('should be added with uap prefixes when install plugin', function () {
+        return api.addPlugin(dummyPluginInfo)
             .then(function () {
                 //  There is the one default capability in manifest with 'internetClient' name
                 var manifestCapabilities = getManifestCapabilities(windowsManifest10);
@@ -158,15 +148,10 @@
             })
             .then(function () {
                 expect(getManifestCapabilities(windowsManifest10).length).toBe(1);
-            })
-            .catch(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('should be added as DeviceCapabilities when install plugin', function (done) {
+    it('should be added as DeviceCapabilities when install plugin', function () {
         function isDeviceCapability (capability) {
             return capability.type === 'DeviceCapability';
         }
@@ -187,7 +172,7 @@
             expect(manifestCapabilities.length).toBe(1);
         }
 
-        api.addPlugin(dummyPluginInfo)
+        return api.addPlugin(dummyPluginInfo)
             .then(function () {
                 checkCapabilitiesAfterInstall(windowsManifest);
                 checkCapabilitiesAfterInstall(windowsManifest10);
@@ -196,11 +181,6 @@
             .then(function () {
                 checkCapabilitiesAfterRemove(windowsManifest);
                 checkCapabilitiesAfterRemove(windowsManifest10);
-            })
-            .catch(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
-                done();
             });
     });
 });
diff --git a/spec/unit/MSBuildTools.spec.js b/spec/unit/MSBuildTools.spec.js
index b610259..94c99ba 100644
--- a/spec/unit/MSBuildTools.spec.js
+++ b/spec/unit/MSBuildTools.spec.js
@@ -36,17 +36,14 @@
         return (availableVersions.indexOf(version) >= 0) ? Q.resolve(new MSBuildTools(version, fakeToolsPath(version))) : Q.resolve(null);
     };
 
-    var versionTest = function (availableVersions, version, done) {
+    var versionTest = function (availableVersions, version) {
         buildTools.__set__('checkMSBuildVersion', checkMSBuildVersionFake.bind(null, availableVersions));
-        buildTools.findAvailableVersion().then(function (msbuildTools) {
+        return buildTools.findAvailableVersion().then(function (msbuildTools) {
             expect(msbuildTools).not.toBeNull();
             expect(msbuildTools.version).toBeDefined();
             expect(msbuildTools.path).toBeDefined();
             expect(msbuildTools.version).toBe(version);
             expect(msbuildTools.path).toBe(fakeToolsPath(version));
-            if (typeof done === 'function') {
-                done();
-            }
         });
     };
 
@@ -58,34 +55,28 @@
         buildTools.__set__('checkMSBuildVersion', checkMSBuildVersionOriginal);
     });
 
-    it('spec.1 should find 14.0 available version if 12.0 is unavailable', function (done) {
-        versionTest(['14.0'], '14.0', done);
+    it('spec.1 should find 14.0 available version if 12.0 is unavailable', function () {
+        return versionTest(['14.0'], '14.0');
     });
 
-    it('spec.2 should select 14.0 available version even if 12.0 is also available', function (done) {
-        versionTest(['14.0', '12.0', '4.0'], '14.0', done);
+    it('spec.2 should select 14.0 available version even if 12.0 is also available', function () {
+        return versionTest(['14.0', '12.0', '4.0'], '14.0');
     });
 
-    it('spec.3 should find 12.0 available version if 14.0 is unavailable', function (done) {
-        versionTest(['12.0', '4.0'], '12.0', done);
+    it('spec.3 should find 12.0 available version if 14.0 is unavailable', function () {
+        return versionTest(['12.0', '4.0'], '12.0');
     });
 
-    it('spec.4 should find 4.0 available version if neither 12.0 nor 14.0 are available', function (done) {
-        versionTest(['4.0'], '4.0', done);
+    it('spec.4 should find 4.0 available version if neither 12.0 nor 14.0 are available', function () {
+        return versionTest(['4.0'], '4.0');
     });
 
-    it('spec.5 should produce an error if there is no available versions', function (done) {
-        var resolveSpy = jasmine.createSpy();
-
+    it('spec.5 should produce an error if there is no available versions', function () {
         buildTools.__set__('checkMSBuildVersion', checkMSBuildVersionFake.bind(null, []));
-        buildTools.findAvailableVersion()
-            .then(resolveSpy, function (error) {
-                expect(error).toBeDefined();
-            })
-            .finally(function () {
-                expect(resolveSpy).not.toHaveBeenCalled();
-                done();
-            });
+        return buildTools.findAvailableVersion().then(
+            () => fail('Expected promise to be rejected'),
+            error => expect(error).toBeDefined()
+        );
     });
 });
 
@@ -111,7 +102,7 @@
             'MSBuildToolsPath\tREG_SZ\t' + fakeToolsPath(version) + '\r\n\r\n')
         );
 
-        checkMSBuildVersion(version).then(function (actual) {
+        return checkMSBuildVersion(version).then(function (actual) {
             expect(actual.version).toBe(version);
             expect(actual.path).toBe(fakeToolsPath(version));
         });
@@ -120,7 +111,7 @@
     it('spec.7 should return null if no tools found for version', function () {
         spawnSpy.and.returnValue(Q.resolve('ERROR: The system was unable to find the specified registry key or value.'));
 
-        checkMSBuildVersion('14.0').then(function (actual) {
+        return checkMSBuildVersion('14.0').then(function (actual) {
             expect(actual).not.toBeDefined();
         });
     });
@@ -128,7 +119,7 @@
     it('spec.8 should return null on internal error', function () {
         spawnSpy.and.returnValue(Q.reject());
 
-        checkMSBuildVersion('14.0').then(function (actual) {
+        return checkMSBuildVersion('14.0').then(function (actual) {
             expect(actual).not.toBeDefined();
         });
     });
@@ -206,9 +197,6 @@
     var fakeVersion = '22.0.12635.5';
     var fakeVersionParsed = '22.0';
 
-    var fail = jasmine.createSpy('fail');
-    var success = jasmine.createSpy('success');
-
     var spawnOriginal = buildTools.__get__('spawn');
     var spawnSpy = jasmine.createSpy('spawn');
 
@@ -220,29 +208,23 @@
         buildTools.__set__('spawn', spawnOriginal);
     });
 
-    it('should return MSBuildTools instance', function (done) {
+    it('should return MSBuildTools instance', function () {
         spawnSpy.and.returnValue(Q(fakeVersion));
 
-        buildTools.getMSBuildToolsAt(fakePath)
+        return buildTools.getMSBuildToolsAt(fakePath)
             .then(function (tools) {
                 expect(tools).toEqual(jasmine.any(MSBuildTools));
                 expect(tools.version).toBe(fakeVersionParsed);
                 expect(tools.path).toBe(fakePath);
-            }, fail)
-            .done(function () {
-                expect(fail).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('should reject promise if no msbuild found', function (done) {
+    it('should reject promise if no msbuild found', function () {
         spawnSpy.and.returnValue(Q.reject());
 
-        buildTools.getMSBuildToolsAt(messyPath)
-            .then(success, fail)
-            .done(function () {
-                expect(success).not.toHaveBeenCalled();
-                done();
-            });
+        return buildTools.getMSBuildToolsAt(messyPath).then(
+            () => fail('Expected promise to be rejected'),
+            () => expect().nothing()
+        );
     });
 });
diff --git a/spec/unit/build.spec.js b/spec/unit/build.spec.js
index e9d81d2..4023ea1 100644
--- a/spec/unit/build.spec.js
+++ b/spec/unit/build.spec.js
@@ -108,21 +108,17 @@
         build.__set__('ConfigParser', configParserOriginal);
     });
 
-    it('spec.1 should reject if not launched from project directory', function (done) {
-        var rejectSpy = jasmine.createSpy();
+    it('spec.1 should reject if not launched from project directory', function () {
         var buildSpy = jasmine.createSpy();
 
         // utils.isCordovaProject is a spy, so we can call andReturn directly on it
         utils.isCordovaProject.and.returnValue(false);
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
 
-        build.run([ 'node', buildPath, '--release', '--debug' ])
-            .fail(rejectSpy)
-            .finally(function () {
-                expect(rejectSpy).toHaveBeenCalled();
-                expect(buildSpy).not.toHaveBeenCalled();
-                done();
-            });
+        return build.run([ 'node', buildPath, '--release', '--debug' ]).then(
+            () => fail('Expected promise to be rejected'),
+            () => expect(buildSpy).not.toHaveBeenCalled()
+        );
     });
 
     it('spec.2 should throw if both debug and release args specified', function () {
@@ -145,12 +141,12 @@
         }).toThrow();
     });
 
-    it('should respect build configuration from \'buildConfig\' option', function (done) {
+    it('should respect build configuration from \'buildConfig\' option', function () {
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: jasmine.createSpy(), path: testPath }]);
         var buildConfigPath = path.resolve(__dirname, 'fixtures/fakeBuildConfig.json');
 
-        build.run({ buildConfig: buildConfigPath })
+        return build.run({ buildConfig: buildConfigPath })
             .finally(function () {
                 expect(prepare.updateBuildConfig).toHaveBeenCalled();
                 var buildOpts = prepare.updateBuildConfig.calls.argsFor(0)[0];
@@ -163,56 +159,49 @@
                     expect(buildOpts[key]).toBeDefined();
                     expect(buildOpts[key]).toEqual(buildConfig[key]);
                 });
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
             });
     }, 20000);
 
-    it('spec.4 should call buildProject of MSBuildTools with buildType = "release" if called with --release argument', function (done) {
+    it('spec.4 should call buildProject of MSBuildTools with buildType = "release" if called with --release argument', function () {
         var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             expect(buildType).toBe('release');
         });
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
 
-        build.run({ release: true })
+        return build.run({ release: true })
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.5 should call buildProject of MSBuildTools with buildType = "debug" if called without arguments', function (done) {
+    it('spec.5 should call buildProject of MSBuildTools with buildType = "debug" if called without arguments', function () {
         var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             expect(buildType).toBe('debug');
         });
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
 
-        build.run([ 'node', buildPath ])
+        return build.run([ 'node', buildPath ])
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.6 should call buildProject of MSBuildTools with buildArch = "arm" if called with --archs="arm" argument', function (done) {
+    it('spec.6 should call buildProject of MSBuildTools with buildArch = "arm" if called with --archs="arm" argument', function () {
         var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             expect(buildArch).toBe('arm');
         });
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
 
-        build.run({ archs: 'arm' })
+        return build.run({ archs: 'arm' })
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.7 should call buildProject of MSBuildTools once for all architectures if called with --archs="arm x86 x64 anycpu" argument', function (done) {
+    it('spec.7 should call buildProject of MSBuildTools once for all architectures if called with --archs="arm x86 x64 anycpu" argument', function () {
         var armBuild = jasmine.createSpy();
         var x86Build = jasmine.createSpy();
         var x64Build = jasmine.createSpy();
@@ -244,100 +233,85 @@
                 }
             }]);
 
-        build.run({ archs: 'arm x86 x64 anycpu', argv: ['--phone'] })
+        return build.run({ archs: 'arm x86 x64 anycpu', argv: ['--phone'] })
             .finally(function () {
                 expect(armBuild).toHaveBeenCalled();
                 expect(x86Build).toHaveBeenCalled();
                 expect(x64Build).toHaveBeenCalled();
                 expect(anyCpuBuild).toHaveBeenCalled();
-                done();
             });
     });
 
-    xit('spec.8 should fail buildProject if built with MSBuildTools version 4.0', function (done) {
+    xit('spec.8 should fail buildProject if built with MSBuildTools version 4.0', function () {
         var buildSpy = jasmine.createSpy();
-        var errorSpy = jasmine.createSpy();
 
         createFindAllAvailableVersionsMock([{ version: '4.0', buildProject: buildSpy, path: testPath }]);
         createConfigParserMock('8.0');
 
-        build.run({ argv: ['--win'] })
-            .fail(function (error) {
-                errorSpy();
+        return build.run({ argv: ['--win'] }).then(
+            () => fail('Expected promise to be rejected'),
+            error => {
                 expect(error).toBeDefined();
-            })
-            .finally(function () {
-                expect(errorSpy).toHaveBeenCalled();
                 expect(buildSpy).not.toHaveBeenCalled();
-                done();
-            });
+            }
+        );
     });
 
-    it('spec.9 should call buildProject of MSBuildTools if built for windows 8.1', function (done) {
+    it('spec.9 should call buildProject of MSBuildTools if built for windows 8.1', function () {
         var buildSpy = jasmine.createSpy();
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
         createConfigParserMock('8.1');
 
-        build.run({ argv: ['--win'] })
+        return build.run({ argv: ['--win'] })
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    xit('spec.10 should throw an error if windows-target-version has unsupported value', function (done) {
+    xit('spec.10 should throw an error if windows-target-version has unsupported value', function () {
         var buildSpy = jasmine.createSpy();
-        var errorSpy = jasmine.createSpy();
 
         createFindAvailableVersionMock('14.0', testPath, buildSpy);
         createConfigParserMock('unsupported value here');
 
-        build.run({ argv: ['--win'] })
-            .fail(function (error) {
-                errorSpy();
+        return build.run({ argv: ['--win'] }).then(
+            () => fail('Expected promise to be rejected'),
+            error => {
                 expect(error).toBeDefined();
-            })
-            .finally(function () {
-                expect(errorSpy).toHaveBeenCalled();
                 expect(buildSpy).not.toHaveBeenCalled();
-                done();
-            });
+            }
+        );
     });
 
-    it('spec.11 should call buildProject of MSBuildTools if built for windows phone 8.1', function (done) {
+    it('spec.11 should call buildProject of MSBuildTools if built for windows phone 8.1', function () {
         var buildSpy = jasmine.createSpy();
 
         createFindAllAvailableVersionsMock([{ version: '14.0', buildProject: buildSpy, path: testPath }]);
         createConfigParserMock(null, '8.1');
 
-        build.run({ argv: ['--phone'] })
+        return build.run({ argv: ['--phone'] })
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    xit('spec.12 should throw an error if windows-phone-target-version has unsupported value', function (done) {
+    xit('spec.12 should throw an error if windows-phone-target-version has unsupported value', function () {
         var buildSpy = jasmine.createSpy();
-        var errorSpy = jasmine.createSpy();
 
         createFindAvailableVersionMock('14.0', testPath, buildSpy);
         createConfigParserMock(null, 'unsupported value here');
 
-        build.run({ argv: ['--phone'] })
-            .fail(function (error) {
-                errorSpy();
+        return build.run({ argv: ['--phone'] }).then(
+            () => fail('Expected promise to be rejected'),
+            error => {
                 expect(error).toBeDefined();
-            })
-            .finally(function () {
-                expect(errorSpy).toHaveBeenCalled();
                 expect(buildSpy).not.toHaveBeenCalled();
-                done();
-            });
+            }
+        );
     });
 
-    it('spec.13a should be able to override target via --appx parameter', function (done) {
+    it('spec.13a should be able to override target via --appx parameter', function () {
         var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             // check that we build Windows 10 and not Windows 8.1
             expect(solutionFile.toLowerCase()).toMatch('cordovaapp.windows10.jsproj');
@@ -347,14 +321,13 @@
         // provision config to target Windows 8.1
         createConfigParserMock('8.1', '8.1');
         // explicitly specify Windows 10 as target
-        build.run({ argv: ['--appx=uap'] })
+        return build.run({ argv: ['--appx=uap'] })
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.13b should be able to override target via --appx parameter', function (done) {
+    it('spec.13b should be able to override target via --appx parameter', function () {
         var buildSpy = jasmine.createSpy().and.callFake(function (solutionFile, buildType, buildArch) {
             // check that we build Windows 10 and not Windows 8.1
             expect(solutionFile.toLowerCase()).toMatch('cordovaapp.windows10.jsproj');
@@ -364,14 +337,13 @@
         // provision config to target Windows 8.1
         createConfigParserMock('8.1', '8.1');
         // explicitly specify Windows 10 as target
-        build.run({ argv: ['--appx=uwp'] })
+        return build.run({ argv: ['--appx=uwp'] })
             .finally(function () {
                 expect(buildSpy).toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.14a should use user-specified msbuild if VSINSTALLDIR variable is set', function (done) {
+    it('spec.14a should use user-specified msbuild if VSINSTALLDIR variable is set', function () {
         var customMSBuildPath = '/some/path';
         var msBuildBinPath = path.join(customMSBuildPath, 'MSBuild/15.0/Bin');
         var customMSBuildVersion = '15.0';
@@ -387,20 +359,17 @@
                 buildProject: jasmine.createSpy('buildProject').and.returnValue(Q())
             }));
 
-        var fail = jasmine.createSpy('fail');
-
-        build.run({})
-            .fail(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
+        return build.run({})
+            .then(() => {
                 expect(MSBuildTools.getMSBuildToolsAt).toHaveBeenCalledWith(msBuildBinPath);
+            })
+            .finally(function () {
                 delete process.env.VSINSTALLDIR;
                 process.env.MSBUILDDIR = backupMSBUILDDIR;
-                done();
             });
     });
 
-    it('spec.14b should use user-specified msbuild if MSBUILDDIR variable is set', function (done) {
+    it('spec.14b should use user-specified msbuild if MSBUILDDIR variable is set', function () {
         var msBuildBinPath = path.join('/some/path', 'MSBuild/15.0/Bin');
         var customMSBuildVersion = '15.0';
         process.env.MSBUILDDIR = msBuildBinPath;
@@ -415,50 +384,39 @@
                 buildProject: jasmine.createSpy('buildProject').and.returnValue(Q())
             }));
 
-        var fail = jasmine.createSpy('fail');
-
-        build.run({})
-            .fail(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
+        return build.run({})
+            .then(() => {
                 expect(MSBuildTools.getMSBuildToolsAt).toHaveBeenCalledWith(msBuildBinPath);
+            })
+            .finally(function () {
                 delete process.env.MSBUILDDIR;
                 process.env.VSINSTALLDIR = backupVSINSTALLDIR;
-                done();
             });
     });
 
-    it('spec.15a should choose latest version if there are multiple versions available with minor version difference', function (done) {
-        var fail = jasmine.createSpy('fail');
+    it('spec.15a should choose latest version if there are multiple versions available with minor version difference', function () {
         var buildTools14 = { version: '14.0', buildProject: jasmine.createSpy('buildTools14'), path: testPath };
         var buildTools15 = { version: '15.0', buildProject: jasmine.createSpy('buildTools15'), path: testPath };
         var buildTools151 = { version: '15.1', buildProject: jasmine.createSpy('buildTools151'), path: testPath };
 
         createFindAllAvailableVersionsMock([buildTools14, buildTools15, buildTools151]);
         // explicitly specify Windows 10 as target
-        build.run({ argv: ['--appx=uap'] })
-            .fail(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
+        return build.run({ argv: ['--appx=uap'] })
+            .then(() => {
                 expect(buildTools151.buildProject).toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.15b should choose latest version if there are multiple versions available with minor version difference', function (done) {
-        var fail = jasmine.createSpy('fail');
+    it('spec.15b should choose latest version if there are multiple versions available with minor version difference', function () {
         var buildTools14 = { version: '14.0', buildProject: jasmine.createSpy('buildTools14'), path: testPath };
         var buildTools15 = { version: '15.0', buildProject: jasmine.createSpy('buildTools15'), path: testPath };
         var buildTools151 = { version: '15.1', buildProject: jasmine.createSpy('buildTools151'), path: testPath };
 
         createFindAllAvailableVersionsMock([buildTools14, buildTools15, buildTools151]);
         // explicitly specify Windows 10 as target
-        build.run({ argv: ['--appx=uwp'] })
-            .fail(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
+        return build.run({ argv: ['--appx=uap'] })
+            .then(() => {
                 expect(buildTools151.buildProject).toHaveBeenCalled();
-                done();
             });
     });
 });
@@ -502,8 +460,7 @@
             });
         });
 
-        it('should pass buildFlags directly to MSBuild', function (done) {
-            var fail = jasmine.createSpy('fail');
+        it('should pass buildFlags directly to MSBuild', function () {
             var buildTools = { version: '14.0', buildProject: jasmine.createSpy('buildProject').and.returnValue(Q()), path: testPath };
             var buildOptions = {
                 argv: ['--buildFlag', 'foo=bar']
@@ -511,15 +468,11 @@
 
             createFindAllAvailableVersionsMock([buildTools]);
 
-            build.run(buildOptions)
-                .fail(fail)
-                .finally(function () {
-                    expect(fail).not.toHaveBeenCalled();
+            return build.run(buildOptions)
+                .then(() => {
                     // CB-12416 AppxBundle=Never is present because we are not building a bundle
                     expect(buildTools.buildProject).toHaveBeenCalledWith(jasmine.any(String),
                         jasmine.any(String), jasmine.any(String), [ 'foo=bar', '/p:AppxBundle=Never' ]);
-
-                    done();
                 });
         });
     });
diff --git a/spec/unit/check_reqs.spec.js b/spec/unit/check_reqs.spec.js
index 433177c..e7a65a1 100644
--- a/spec/unit/check_reqs.spec.js
+++ b/spec/unit/check_reqs.spec.js
@@ -89,75 +89,59 @@
             check_reqs.__set__('config', originalconfig);
         });
 
-        it('Test #002 : that should return a promise, fulfilled with an array of Requirements', function (done) {
+        it('Test #002 : that should return a promise, fulfilled with an array of Requirements', function () {
             check_reqs.__set__('requirements', fakeRequirements);
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
             var checkResult = check_reqs.check_all();
             expect(Q.isPromise(checkResult)).toBeTruthy();
-            checkResult.then(function (result) {
+            return checkResult.then(function (result) {
                 expect(result instanceof Array).toBeTruthy();
                 expect(result.length).toBe(3);
                 result.forEach(function (resultItem) {
                     expect(resultItem instanceof Requirement).toBeTruthy();
                     expect(resultItem.installed).toBeTruthy();
                 });
-                done();
             });
         });
 
-        it('Test #003 : that should not reject if one of requirements is not installed', function (done) {
+        it('Test #003 : that should not reject if one of requirements is not installed', function () {
             check_reqs.__set__('requirements', fakeRequirements);
             fakeCheckFns[0] = function () { return Q.reject('Error message'); };
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
 
-            check_reqs.check_all()
+            return check_reqs.check_all()
                 .then(function (requirements) {
                     expect(requirements.length).toBe(3);
                     expect(requirements[0].installed).toBeFalsy();
-                    done();
-                })
-                .catch(function (error) {
-                    expect(error).not.toBeDefined();
-                    done();
                 });
         });
 
-        it('Test #004 : that should reject if one of checks has internal erorrs', function (done) {
+        it('Test #004 : that should reject if one of checks has internal erorrs', function () {
             check_reqs.__set__('requirements', fakeRequirements);
             fakeCheckFns[0] = checkSpy.and.throwError('Fatal error');
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
 
-            check_reqs.check_all()
-                .then(function (requirements) {
-                    expect(requirements).not.toBeDefined();
-                    done();
-                })
-                .catch(function (error) {
-                    expect(error).toMatch('Fatal error');
-                    done();
-                });
+            return check_reqs.check_all().then(
+                () => fail('Expected promise to be rejected'),
+                error => expect(error).toMatch('Fatal error')
+            );
         });
 
-        it('Test #005 : that should not run other requirements checks if `fatal` requirement isn\'t installed', function (done) {
+        it('Test #005 : that should not run other requirements checks if `fatal` requirement isn\'t installed', function () {
             check_reqs.__set__('requirements', fakeRequirements);
             // The second requirement is fatal, so we're setting up second check to fail
             fakeCheckFns[1] = checkSpy.and.returnValue(Q.reject('Error message'));
             check_reqs.__set__('checkFns', fakeCheckFns);
             check_reqs.__set__('config', fakeConfig);
 
-            check_reqs.check_all()
+            return check_reqs.check_all()
                 .then(function (requirements) {
                     expect(requirements.length).toBe(2);
                     expect(requirements[1].isFatal).toBeTruthy();
                     expect(checkSpy.calls.count()).toBe(2);
-                    done();
-                })
-                .catch(function (error) {
-                    expect(error).not.toBeDefined();
-                    done();
                 });
         });
     });
diff --git a/spec/unit/clean.spec.js b/spec/unit/clean.spec.js
index c68b012..72b97cb 100644
--- a/spec/unit/clean.spec.js
+++ b/spec/unit/clean.spec.js
@@ -32,7 +32,7 @@
         shell.rm('-rf', currentProject);
     });
 
-    it('spec 1. should remove icons when ran inside Cordova project', function (done) {
+    it('spec 1. should remove icons when ran inside Cordova project', function () {
         var config = {
             platform: 'windows',
             root: currentProject,
@@ -43,17 +43,9 @@
             }
         };
 
-        var rejected = jasmine.createSpy().and.callFake(function (err) {
-            // Log error:
-            expect(err).not.toBeDefined();
-        });
-        prepareModule.clean.call(config)
+        return prepareModule.clean.call(config)
             .then(function () {
                 expect(fs.existsSync(iconPath)).toBeFalsy();
-            }, rejected)
-            .finally(function () {
-                expect(rejected).not.toHaveBeenCalled();
-                done();
             });
     });
 });
diff --git a/spec/unit/deployment.spec.js b/spec/unit/deployment.spec.js
index fb62d48..a93b63f 100644
--- a/spec/unit/deployment.spec.js
+++ b/spec/unit/deployment.spec.js
@@ -98,54 +98,38 @@
         }
     });
 
-    it('Test #002 : enumerateDevices returns a valid set of objects', function (done) {
+    it('Test #002 : enumerateDevices returns a valid set of objects', function () {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
                 expect(deviceList.length).toBe(3);
                 expect(deviceList[0].name).toBe('Lumia 1520 (RM-940)');
                 expect(deviceList[0].index).toBe(0);
                 expect(deviceList[0].type).toBe('device');
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
             });
     });
 
-    it('Test #003 : installAppPackage passes the correct set of parameters', function (done) {
+    it('Test #003 : installAppPackage passes the correct set of parameters', function () {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ false);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ false);
             });
     });
 
-    it('Test #004 : installAppPackage passes the correct set of parameters when updating', function (done) {
+    it('Test #004 : installAppPackage passes the correct set of parameters when updating', function () {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ true);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ true);
             });
     });
 
-    it('Test #005 : uninstallAppPackage passes the correct set of parameters', function (done) {
+    it('Test #005 : uninstallAppPackage passes the correct set of parameters', function () {
         var deploymentTool = deployment.getDeploymentTool('10.0');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
                 deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[2]);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
             });
     });
 });
@@ -195,9 +179,9 @@
         }
     });
 
-    it('Test #006 : enumerateDevices returns a valid set of objects', function (done) {
+    it('Test #006 : enumerateDevices returns a valid set of objects', function () {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
                 expect(deviceList.length).toBe(12);
                 expect(deviceList[0].name).toBe('Device');
@@ -206,70 +190,46 @@
                 expect(deviceList[5].name).toBe('Mobile Emulator 10.0.10150.0 1080p 6 inch 2GB');
                 expect(deviceList[5].index).toBe(5);
                 expect(deviceList[5].type).toBe('emulator');
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
             });
     });
 
-    it('Test #007 : installAppPackage passes the correct set of parameters', function (done) {
+    it('Test #007 : installAppPackage passes the correct set of parameters', function () {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ false);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ false);
             });
     });
 
-    it('Test #008 : installAppPackage passes the correct set of parameters when updating', function (done) {
+    it('Test #008 : installAppPackage passes the correct set of parameters when updating', function () {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ true);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ false, /* shouldUpdate */ true);
             });
     });
 
-    it('Test #009 : installAppPackage passes the correct set of parameters when launching', function (done) {
+    it('Test #009 : installAppPackage passes the correct set of parameters when launching', function () {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ true, /* shouldUpdate */ false);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ true, /* shouldUpdate */ false);
             });
     });
 
-    it('Test #010 : installAppPackage passes the correct set of parameters when updating and launching', function (done) {
+    it('Test #010 : installAppPackage passes the correct set of parameters when updating and launching', function () {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ true, /* shouldUpdate */ true);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.installAppPackage(TEST_APP_PACKAGE_NAME, deviceList[0], /* shouldLaunch */ true, /* shouldUpdate */ true);
             });
     });
 
-    it('Test #011 : uninstallAppPackage passes the correct set of parameters', function (done) {
+    it('Test #011 : uninstallAppPackage passes the correct set of parameters', function () {
         var deploymentTool = deployment.getDeploymentTool('8.1');
-        deploymentTool.enumerateDevices()
+        return deploymentTool.enumerateDevices()
             .then(function (deviceList) {
-                deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[5]);
-                done();
-            }).fail(function err (errMsg) {
-                expect(errMsg).toBeUndefined();
-                done();
+                return deploymentTool.uninstallAppPackage(TEST_APP_PACKAGE_ID, deviceList[5]);
             });
     });
 });
diff --git a/spec/unit/package.spec.js b/spec/unit/package.spec.js
index 03bac51..8bf4474 100644
--- a/spec/unit/package.spec.js
+++ b/spec/unit/package.spec.js
@@ -19,7 +19,6 @@
 var path = require('path');
 var rewire = require('rewire');
 var shell = require('shelljs');
-var Q = require('q');
 var platformRoot = '../../template';
 var pkgRoot = './template/';
 var pkgPath = path.join(pkgRoot, 'AppPackages');
@@ -44,72 +43,48 @@
         shell.cp('-R', testPkgPath, pkgRoot);
     });
 
-    it('spec.1 should find windows anycpu debug package', function (done) {
-        var rejected = jasmine.createSpy();
-
-        pkg.getPackage('windows', 'debug', 'anycpu')
+    it('spec.1 should find windows anycpu debug package', function () {
+        return pkg.getPackage('windows', 'debug', 'anycpu')
             .then(function (pkgInfo) {
                 expect(pkgInfo.type).toBe('windows');
                 expect(pkgInfo.buildtype).toBe('debug');
                 expect(pkgInfo.arch).toBe('anycpu');
                 expect(pkgInfo.script).toBeDefined();
-            }, function (err) {
-                console.error(err);
-                rejected();
-            })
-            .finally(function () {
-                expect(rejected).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.2 should find windows phone anycpu debug package', function (done) {
-        var rejected = jasmine.createSpy();
-
-        pkg.getPackage('phone', 'debug', 'anycpu')
+    it('spec.2 should find windows phone anycpu debug package', function () {
+        return pkg.getPackage('phone', 'debug', 'anycpu')
             .then(function (pkgInfo) {
                 expect(pkgInfo.type).toBe('phone');
                 expect(pkgInfo.buildtype).toBe('debug');
                 expect(pkgInfo.arch).toBe('anycpu');
                 expect(pkgInfo.script).toBeDefined();
-            }, rejected)
-            .finally(function () {
-                expect(rejected).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.3 should not find windows 10 anycpu debug package', function (done) {
-        var resolved = jasmine.createSpy();
-
-        pkg.getPackage('windows10', 'debug', 'anycpu')
-            .then(resolved)
-            .finally(function () {
-                expect(resolved).not.toHaveBeenCalled();
-                done();
-            });
+    it('spec.3 should not find windows 10 anycpu debug package', function () {
+        return pkg.getPackage('windows10', 'debug', 'anycpu')
+            .then(
+                () => fail('Expected promise to be rejected'),
+                () => expect().nothing()
+            );
     });
 
-    it('spec.4 should not find windows anycpu release package', function (done) {
-        var resolved = jasmine.createSpy();
-
-        pkg.getPackage('windows', 'release', 'anycpu')
-            .then(resolved)
-            .finally(function () {
-                expect(resolved).not.toHaveBeenCalled();
-                done();
-            });
+    it('spec.4 should not find windows anycpu release package', function () {
+        return pkg.getPackage('windows', 'release', 'anycpu')
+            .then(
+                () => fail('Expected promise to be rejected'),
+                () => expect().nothing()
+            );
     });
 
-    it('spec.5 should not find windows x86 debug package', function (done) {
-        var resolved = jasmine.createSpy();
-
-        pkg.getPackage('windows', 'debug', 'x86')
-            .then(resolved)
-            .finally(function () {
-                expect(resolved).not.toHaveBeenCalled();
-                done();
-            });
+    it('spec.5 should not find windows x86 debug package', function () {
+        return pkg.getPackage('windows', 'debug', 'x86')
+            .then(
+                () => fail('Expected promise to be rejected'),
+                () => expect().nothing()
+            );
     });
 
     it('end', function () {
@@ -156,27 +131,7 @@
 });
 
 describe('getAppId method', function () {
-    it('spec.10 should properly get phoneProductId value from manifest', function (done) {
-        var resolve = jasmine.createSpy();
-
-        Q(pkg.getAppId(pkgRoot))
-            .then(resolve)
-            .finally(function () {
-                expect(resolve).toHaveBeenCalledWith('$guid1$');
-                done();
-            });
-    });
-});
-
-describe('getPackageName method', function () {
-    it('spec.11 should properly get Application Id value from manifest', function (done) {
-        var resolve = jasmine.createSpy();
-
-        Q(pkg.getAppId(pkgRoot))
-            .then(resolve)
-            .finally(function () {
-                expect(resolve).toHaveBeenCalledWith('$guid1$');
-                done();
-            });
+    it('spec.11 should properly get Application Id value from manifest', function () {
+        expect(pkg.getAppId(pkgRoot)).toBe('$guid1$');
     });
 });
diff --git a/spec/unit/run.spec.js b/spec/unit/run.spec.js
index 425396c..9b85396 100644
--- a/spec/unit/run.spec.js
+++ b/spec/unit/run.spec.js
@@ -68,7 +68,7 @@
         run.__set__('ranWithElevatedPermissions', ranWithElevatedPermissionsOriginal);
     });
 
-    it('spec.1 should not run if not launched from project directory', function (done) {
+    it('spec.1 should not run if not launched from project directory', function () {
         var buildRun = jasmine.createSpy();
 
         run.__set__('utils.isCordovaProject', isCordovaProjectFalse);
@@ -77,14 +77,13 @@
             return Q.reject(); // rejecting to break run chain
         });
 
-        run.run([ 'node', buildPath ])
-            .finally(function () {
-                expect(buildRun).not.toHaveBeenCalled();
-                done();
-            });
+        return run.run([ 'node', buildPath ]).then(
+            () => fail('Expected promise to be rejected'),
+            () => expect(buildRun).not.toHaveBeenCalled()
+        );
     });
 
-    it('spec.2 should not run if both debug and release args are specified', function (done) {
+    it('spec.2 should not run if both debug and release args are specified', function () {
         var buildRun = jasmine.createSpy();
 
         run.__set__('utils.isCordovaProject', isCordovaProjectTrue);
@@ -93,14 +92,13 @@
             return Q.reject(); // rejecting to break run chain
         });
 
-        run.run({ release: true, debug: true })
-            .finally(function () {
-                expect(buildRun).not.toHaveBeenCalled();
-                done();
-            });
+        return run.run({ release: true, debug: true }).then(
+            () => fail('Expected promise to be rejected'),
+            () => expect(buildRun).not.toHaveBeenCalled()
+        );
     });
 
-    it('spec.3 should not run if device and emulator args are combined', function (done) {
+    it('spec.3 should not run if device and emulator args are combined', function () {
         var buildRun = jasmine.createSpy();
 
         run.__set__('utils.isCordovaProject', isCordovaProjectTrue);
@@ -109,14 +107,13 @@
             return Q.reject(); // rejecting to break run chain
         });
 
-        run.run({ device: true, emulator: true })
-            .finally(function () {
-                expect(buildRun).not.toHaveBeenCalled();
-                done();
-            });
+        return run.run({ device: true, emulator: true }).then(
+            () => fail('Expected promise to be rejected'),
+            () => expect(buildRun).not.toHaveBeenCalled()
+        );
     });
 
-    it('spec.4 should not run if device and target args are combined', function (done) {
+    it('spec.4 should not run if device and target args are combined', function () {
         var buildRun = jasmine.createSpy();
 
         run.__set__('utils.isCordovaProject', isCordovaProjectTrue);
@@ -125,18 +122,16 @@
             return Q.reject(); // rejecting to break run chain
         });
 
-        run.run({ device: true, target: 'sometargethere' })
-            .finally(function () {
-                expect(buildRun).not.toHaveBeenCalled();
-                done();
-            });
+        return run.run({ device: true, target: 'sometargethere' }).then(
+            () => fail('Expected promise to be rejected'),
+            () => expect(buildRun).not.toHaveBeenCalled()
+        );
     });
 
-    it('spec.5 should build and deploy on phone if --phone arg specified', function (done) {
+    it('spec.5 should build and deploy on phone if --phone arg specified', function () {
         var build = jasmine.createSpy();
         var deployToPhone = jasmine.createSpy();
         var deployToDesktop = jasmine.createSpy();
-        var failed = jasmine.createSpy();
 
         run.__set__('utils.isCordovaProject', isCordovaProjectTrue);
         run.__set__('build.run', function () {
@@ -167,18 +162,15 @@
             return Q();
         });
 
-        run.run([ 'node', buildPath, '--phone', '--break' ])
-            .catch(failed)
-            .finally(function () {
-                expect(failed).not.toHaveBeenCalled();
+        return run.run([ 'node', buildPath, '--phone', '--break' ])
+            .then(() => {
                 expect(build).toHaveBeenCalled();
                 expect(deployToPhone).toHaveBeenCalled();
                 expect(deployToDesktop).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.6 should build and deploy on desktop if --phone arg is not specified', function (done) {
+    it('spec.6 should build and deploy on desktop if --phone arg is not specified', function () {
         var build = jasmine.createSpy();
         var deployToPhone = jasmine.createSpy();
         var deployToDesktop = jasmine.createSpy();
@@ -212,16 +204,15 @@
             return Q();
         });
 
-        run.run([ 'node', buildPath ])
+        return run.run([ 'node', buildPath ])
             .finally(function () {
                 expect(build).toHaveBeenCalled();
                 expect(deployToDesktop).toHaveBeenCalled();
                 expect(deployToPhone).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec. 7 should not call build if --nobuild specified', function (done) {
+    it('spec. 7 should not call build if --nobuild specified', function () {
         var build = jasmine.createSpy();
         var deployToDesktop = jasmine.createSpy();
 
@@ -241,15 +232,14 @@
             return Q();
         });
 
-        run.run({ nobuild: true })
+        return run.run({ nobuild: true })
             .finally(function () {
                 expect(deployToDesktop).toHaveBeenCalled();
                 expect(build).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.8 should accept --archs parameter either as cli or as platform arg', function (done) {
+    it('spec.8 should accept --archs parameter either as cli or as platform arg', function () {
 
         spyOn(utils, 'isCordovaProject').and.returnValue(true);
         spyOn(packages, 'getPackage').and.returnValue(Q({ arch: 'arm' }));
@@ -258,12 +248,7 @@
         var anyString = jasmine.any(String);
         var expectedDeployOptions = jasmine.objectContaining({ arch: 'arm' });
 
-        var fail = jasmine.createSpy('fail')
-            .and.callFake(function (err) {
-                console.error(err);
-            });
-
-        run.run({ nobuild: true, argv: ['--archs=arm'] })
+        return run.run({ nobuild: true, argv: ['--archs=arm'] })
             .then(function () {
                 expect(packages.getPackage).toHaveBeenCalledWith(anyString, anyString, 'arm');
                 expect(packages.deployToDesktop).toHaveBeenCalledWith(expectedDeployOptions, anyString, anyString);
@@ -274,15 +259,10 @@
             .then(function () {
                 expect(packages.getPackage).toHaveBeenCalledWith(anyString, anyString, 'arm');
                 expect(packages.deployToDesktop).toHaveBeenCalledWith(expectedDeployOptions, anyString, anyString);
-            })
-            .catch(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
-                done();
             });
     });
 
-    it('spec.9 should fall back to anycpu if --archs parameter is not specified', function (done) {
+    it('spec.9 should fall back to anycpu if --archs parameter is not specified', function () {
 
         spyOn(utils, 'isCordovaProject').and.returnValue(true);
         spyOn(packages, 'getPackage').and.returnValue(Q({ arch: 'anycpu' }));
@@ -291,17 +271,10 @@
         var anyString = jasmine.any(String);
         var expectedDeployOptions = jasmine.objectContaining({ arch: 'anycpu' });
 
-        var fail = jasmine.createSpy('fail');
-
-        run.run({ nobuild: true })
+        return run.run({ nobuild: true })
             .then(function () {
                 expect(packages.getPackage).toHaveBeenCalledWith(anyString, anyString, 'anycpu');
                 expect(packages.deployToDesktop).toHaveBeenCalledWith(expectedDeployOptions, anyString, anyString);
-            })
-            .catch(fail)
-            .finally(function () {
-                expect(fail).not.toHaveBeenCalled();
-                done();
             });
     });
 });