Я архитектор с большим опытом работы с JavaScript, но в прошлом я немного работал с .NET и Java.
Однако я хотел приложить руку к ActionScript3, который, как мне обещали, очень связан с JavaScript.
В качестве стартового проекта я решил попробовать портировать на ActionScript3 одну из моих любимых утилит утверждения — should.js - это делает ваши тестовые коды действительно приятными для чтения.
Обновлено: 19 февраля 2013 г.
Я видел, что путаю свою абстрактную речь, поэтому я заменил часть поста конкретным вопросом. Вот полная картина:
Рассмотрим следующий код JavaScript:
Object.defineProperty(Object.prototype, 'should'
, { set: function(){}
, get:
function(){
return new Assertion(Object(this).valueOf());
}
, configurable: true
, enumerable : false
}
);
Это часть реализации модуля JavaScript Should
. Другая часть — это определение класса Assertion
, который создан со значением и реализует широкий и удобный набор методов утверждения для этого значения. Методы вроде как
var o = Assertion(actualValue)
o.equals(expectedValue1)
o.moreThan(expectedValue2)
o.contains(expectedValue3)
и псевдонимы, чтобы сохранить английскую грамматику
var o = Assertion(actualValue)
o.equal(expectedValue1)
o.contain(expectedValue3)
и псевдонимы для ленивых снайперов, например
o.eql(expectedValue)
o.gt(expectedValue) //greater then
o.gte(...) //greater then or equal
//and so on...
и некоторые соединители, которые просто возвращают this
(это экземпляр Assertion
, созданный с тестовым значением), например
o.be
o.and
Что это дает вам?
Тестовый код выглядит следующим образом:
var person = getPerson();
Should.exist(person); //that's a static call, and that's easy
//but these are a member calls:
person.should.have("name","age","address","friends");
person.name.should.equal("John");
person.age
.should
.be.number()
.and.be.between(20,30);
person.address
.should
.be.string().and
.startWith("\d").and
.endWith(" st.")
//or even
.and.match(/^[0-9]{1,9}\s+[A-Z][a-z0-9 ]* st\.$/);
person.friends
.should
.be.array().and
.be.between(3,5).and
.containOnlyType(String);
Разве это не прекрасно? это простой английский!
Можно спорить об эстетике отступов, о том, куда ставить and
и нужны ли они вообще, но кроме этого — прочитать или написать это может любой: Однажды вы взяли атрибут «следует», который существует на всех em> объект, но не портит итерации карты — вы можете продолжать связывать все, что вам нужно, в отношении значения, с которого вы начали.
Он может иметь более изящные инструменты итерации, утилиты отражения, быть дополнен тестовыми функциями, относящимися к вашей объектной модели, и так далее и тому подобное, но давайте просто закончим первый шаг :)
Но для этого вам нужно, чтобы каждый объект в системе имел неперечисляемое смарт-свойство с именем should
, которое в своей геттерной функции возвращает Assertion
объект, созданный с this
в качестве тестируемого значения.
(вы еще ничего не видели - подождите, чтобы увидеть красивые сообщения об отклонении, которые он выдает! Вкуснятина!! Так что да - я бы с радостью пожертвовал возможностью называть атрибут "следует"... и с радостью также откажусь от intelisense - по крайней мере, пока это простой английский)
Итак, в комментариях bfavaretto дал нам первый шаг — мы знаем, как предотвратить перечисление атрибута — отлично и спасибо!!
Теперь можем ли мы сделать это атрибутом-получателем, чья функция может получить доступ к this
?
Когда я закончу, я собираюсь разместить его в каком-нибудь общедоступном репозитории под лицензией MIT, чтобы мы все могли повеселиться :)
Помочь кому-нибудь?
Object.setPropertyIsEnumerable
< /а> - person bfavaretto   schedule 14.02.2013