Over the last few days, I have more or less gotten Dart's awesome unit testing working with a Backbone.js application. Thanks to the magic of Dart's js-interop, I have a real test running against the Funky Calendar from Recipes with Backbone. And after last night, I have setup and teardown working. For my latest feat of insanity (and I mean that, there's no real reason to do this) I will attempt testing the creation of appointments in the Backbone.js calendar.
If there is a deficiency to testing Dart applications, it is the inability to stub HTTP requests. Although this makes unit testing tougher, it has the advantage of forcing developers into a more full-stack frame of mind. Towards that end, I have a “real fake” test server (plummbur-kruk) backing my REST-like Backbone application in test. In the test setup, I am already creating a calendar appointment for the current month:
setUp((){
document.head.append(new BaseElement()..href = Kruk.SERVER_ROOT);;
el = document.body.append(new Element.html('<div id=calendar>'));
var doc = '''
{
"title": "Get Funky",
"description": "asdf",
"startDate": "${fifteenth}"
}''';
return Future.wait([
Kruk.create(doc),
Kruk.alias('/widgets', as: '/appointments')
]);
});With that setup in place, can start my Backbone application and eventually check my expectation that the appointment on the 15th of the month is included in the app:expect(cell.text, matches("Get Funky"));Tonight, I would like add a new test that clicks on particular date, enters appointment information, clicks the save button, and finally verifies that the appointment is now included on the calendar.I start with the usual Backbone test thing (though with a Dart js-interop twist) by creating an instance of the Backbone application and ensuring that Backbone history is running properly:
test("can create new appointments", (){
new js.Proxy(js.context.Cal, query('#calendar'));
js.context.Backbone.history.loadUrl();
// ...
});Next, I find the table cell that contains the 14th of the month and click on it: test("can create new appointments", (){
// ...
var cell = queryAll('td').
where((el)=> el.id == fourteenth).
first
..click();
// ...
});
This should result in a popup dialog with a few appointment fields. I fill in those appointment values next: test("can create new appointments", (){
// ...
query('#calendar-add-appointment')
..query('input.title').
value = 'Test Appointment'
..query('input.description').
value = 'asdf';
// ...
});Finally, I click the OK button in the popup: test("can create new appointments", (){
// ...
query('.ui-dialog-buttonset').
query('button').
click();
// ...
});With that, I should be able to check my expectation that the fourteenth of the month now contains an appointment created in my test (after a brief wait for all of the Backbone events to propagate): test("can create new appointments", (){
// ...
new Timer(
new Duration(milliseconds: 10),
expectAsync0((){
expect(cell.text, matches("Test Appointment"));
})
);
});But, for some reason, that fails:FAIL: the initial view can create new appointments
Expected: match 'Test Appointment'
Actual: '14'All that is in the table cell for the 14th is the day of the month. If I remove the teardown step to see the status of the (un-styled) popup dialog, I find that everything seems to have worked except for the clicking of the button:
And oddly enough, if I use jQuery (which is available to me via js-interop), I am able to click the button:
js.context.jQuery('.ui-dialog-buttonset button').click();Which results in a successful test:PASS: the initial view can create new appointmentsI am at a loss to explain why the click event in jQuery works, but it does not work from Dart. Perhaps there is an additional event property that is being added by jQuery? I have a working test, but would very much like to have the test in pure Dart (or at least have a idea why that won't work). So I will likely use that as an excuse to continue investigation tomorrow…
Day #882
No comments:
Post a Comment