We used to throw if event listener is not a function in Stack:

```js
ReactDOM.render(
  <h1 onClick={{}}>Hello World!</h1>,
  document.getElementById('container')
);
```

<img width="565" alt="screen shot 2017-08-08 at 3 41 08 pm" src="https://user-images.githubusercontent.com/810438/29077502-2646412e-7c50-11e7-8c99-3b7f6c0a2589.png">

Fiber silently ignores this.

I think we should throw. This would let us add support for objects (e.g. for passive listener configuration) if we want to in a minor rather than a major.
});
    it('will not assign a function custom attributes', function() {
      spyOn(console, 'error');
      var el = ReactTestUtils.renderIntoDocument(<div whatever={() => {}} />);
      expect(el.hasAttribute('whatever')).toBe(false);
      expectDev(console.error.calls.argsFor(0)[0]).toContain(
        'Warning: Invalid prop `whatever` on <div> tag',
      );
    });
    it('will assign an object custom attributes', function() {
      var el = ReactTestUtils.renderIntoDocument(<div whatever={{}} />);
      expect(el.getAttribute('whatever')).toBe('[object Object]');
    });
    it('allows cased data attributes', function() {
      var el = ReactTestUtils.renderIntoDocument(<div data-fooBar="true" />);
      expect(el.getAttribute('data-foobar')).toBe('true');
    });
    it('allows cased custom attributes', function() {
      var el = ReactTestUtils.renderIntoDocument(<div fooBar="true" />);
      expect(el.getAttribute('foobar')).toBe('true');
    });
    it('warns on NaN attributes', function() {
      spyOn(console, 'error');
      var el = ReactTestUtils.renderIntoDocument(<div whatever={NaN} />);
      expect(el.getAttribute('whatever')).toBe('NaN');
      expectDev(console.error.calls.argsFor(0)[0]).toContain(
        'Warning: Received NaN for numeric attribute `whatever`. If this is ' +
          'expected, cast the value to a string.\n    in div',
      );
    });