power-assertの例外処理を見やすくする

> 
power-assert is fully compatible with [assert](https://nodejs.org/api/assert.html). So functions below are also available though they are not enhanced (does not produce descriptive message).
> 
* `assert.fail(actual, expected, message, operator)`
* `assert.throws(block, [error], [message])`
* `assert.doesNotThrow(block, [message])`
* `assert.ifError(value)`
>
[API - power-assert/v1.3.1/README.md](https://github.com/power-assert-js/power-assert/blob/v1.3.1/README.md#api)

とあるように、`assert.throws`はテスト失敗時に整形されません。

```js:test.js
import assert from 'power-assert';

assert.throws(
  () => {
    throw new Error('foo');
  },
  /^bar$/
);
// Error: foo
//    at test.js:5:11
```

エラーメッセージの比較をしたいときは、以下のように書く必要があります。

```js:test.js
import assert from 'power-assert';

assert.throws(
  () => {
    throw new Error('foo');
  },
  (error) => {
    assert(error.message === 'bar');
    return true; // requirement :(
  }
);
// AssertionError:   # test.js:8
//
//   assert(error.message === 'bar')
//          |     |       |
//          |     "foo"   false
//          Error{}
```

throwsの改善
---

このままでも読めなくは無いですが、このテストケースの行数をもう少し減らしたいので、ヘルパを作成します。

```js:test.js
import assert from 'power-assert';

function throws(block) {
  let error = {};
  try {
    block();
  } catch (e) {
    error = e;
  }
  return error;
}

assert(throws(
  () => {throw new Error('foo');},
).message === 'bar');
//
// AssertionError:   # test.js:13
//
//   assert(throws(() => { throw new Error('foo'); }).message === 'bar')
//          |                                         |       |
//          Error{}                                   "foo"   false
```

また上記ヘルパは、例外が発生しなかったとき、以下のように出力を得ます。

```js:test.js
// ...
assert(throws(
  () => {/* noop */},
).message === 'bar');
//
// AssertionError:   # test.js:13
//
//   assert(throws(() => {}).message === 'bar')
//          |                |       |
//          |                |       false
//          Object{}         undefined
```

Promiseのrejectedのテスト
---
`Promise`がrejectされたテストを書きたいときも、単純に書くとやや助長です。

```js:test.js
import Promise from 'bluebird';
import assert from 'power-assert';

Promise.resolve('foo').then(
  () => {
    throw new Error('Missing expected rejection..');
  },
  (reason) => {
    assert(reason.message === 'bar');
  }
);
// Unhandled rejection Error: Missing expected rejection..

Promise.reject(new Error('foo')).then(
  () => {
    throw new Error('Missing expected rejection..');
  },
  (reason) => {
    assert(reason.message === 'bar');
  }
);
//
// Unhandled rejection AssertionError:   # test.js:9
//
//   assert(reason.message === 'bar')
//          |      |       |
//          |      "foo"   false
//          Error{}
```

> ビルドインの`Promise`はthrowすると何も出力しないため、[bluebird](https://github.com/petkaantonov/bluebird#readme)を使用しています

`babel-stage-1`と`babel-polyfill`で`async/await`文が使えるため、これもヘルパを利用して簡素に書くことが可能です。

```js:test.js
import Promise from 'bluebird';
import assert from 'power-assert';

function rejects(promise) {
  return promise
  .then(
    () => Promise.reject(new Error('Missing expected rejection..')),
    (reason) => Promise.resolve(reason),
  );
}

async function test1() {
  assert((await rejects(Promise.resolve('foo'))).message === 'bar');
}
async function test2() {
  assert((await rejects(Promise.reject(new Error('foo')))).message === 'bar');
}

test1();
// Unhandled rejection Error: Missing expected rejection..

test2();
// Unhandled rejection AssertionError:   # test.js:14
//
//   assert((await rejects(Promise.reject(new Error('foo')))).message === 'bar')
//           |             |       |      |                   |       |
//           |             |       |      Error{}             "foo"   false
//           |             |       Promise{_bitField:16777216,"_fulfillmentHandler0":#Error#,"_rejectionHandler0":undefined,"_promise0":undefined,"_receiver0":undefined}
//           Error{}       #function#
```

assert-exception
---
上記ヘルパ`throws`, `rejects`を、[assert-exception](https://github.com/59naga/assert-exception#readme)という名前で公開しています。