???????????
????????ε??????????????????????????????????????????????????????????????????????????DOM???????????????????????“????”?????????????“??????????”??
?????????????????????????????????????????潻?????????????????????????????????????DOM??????ɡ????????????????????????????DOM????и??£????????ν??????
???????????????????λ???????DOM???????????????????????????????κ???????仯????????????????????????з?????????2??????????????仰????????????DOM???????????н??????????——DOM????e??????????????????????
???????磬???????????????????????????????????????????????????????????????AJAX?????????y??????DOM?в????????????????????????????????????????
function purchase(productId) {
$.post(
"/products/"??
{ "id": productId }
).done(function() {
$(".header").html(
"<div class='alert-success'>Your order was placed</div>");
}).fail(function() {
$(".header").html(
"<div class='alert-failure'>There was a problem</div>");
});
?????????????????ò?????????????CSS??alert-success????????????????????????????ζ?????????????κ?????????????????????????????????????????????????????HTML?????????????????
???????????????????data-test-?????
function purchase(productId) {
$.post(
"/products/"??
{ "id": productId }
).done(function() {
$(".header").html(
"<div data-test-purchase-successful class='alert-success'>Your order was placed</div>");
}).fail(function() {
$(".header").html(
"<div data-test-purchase-failed class='alert-failure'>There was a problem</div>");
});
??????????????????????????????????д???????????Щ????仯??????????????????????????γ???????????????????????????????????????????????????????????????????????????????????????????????С???????????????Ч???仯???????????????????????????QA??????????о???????????????
?????????????????????Capybara????????????????й????????????????????????????????????DOM????????????????????????????????????????????????Web??ó????????????????????????????????????????????PhantomJS???????????????????????????????????????????
?????????????????????????????????????????????????
??????“???”???????
????????????????????в???????????????????????????????????????????????????в????????????Щ??????????????????????????????ó???????????????????????????????????????д??????????
?????????????????????????????????????????????????ζ????????????????????????????????????????????ó???????????????????????
????????????????????????“?????????????????consumer-driven contracts??”???????????????????????????????????????????????綨????????????
????????????????????????????????????????ж???????????÷??????????汾???????????á???????ò????????????????????洢??????????????????????????????????????????
????????????????????????HTTP????????????Ruby?У?VCR???????????????????????????????????????HTTPЭ????????????????????в?????????????????????????????????????硣??????????????????????????????????????????????Ч??
?????????????????????????????????÷???????????????????????????????????HTTP????????????????????????á??????÷??????????????????????????Щ?????????????????????Ч???????ó????????????д洢?????????????????????“???”???????????????Щ???
??????????????????????HTTP??????????????
??????????????????????????в??????????β?????????????????
???????????
??????????£?????????y??ж????????????????????????????????????????????????????????????????????????????????????????????????????Щ??????????????
??????????????????????????????????????????????仰?????????????????????????????????????????????????????б??????????????????????
???????磬??????????????????????????????????????????????????????????????????????????????????????????????裬???????????????
????????????????????
???????????е???????????????????????????????????????
?????????????????????
???????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????У??????????????????????????????????ù????????????????????????д???????????????????????????????????
????????Σ??????????????????????????????????????????????????????λ?á???????????????????
??????????α?д????????????????????????????????????????????Χ??????????????????????????????????????????????????á?
??????????????????????????????????????????????????????????????????????????HTML??????????????????——??Щ????????????????????????????д?????????????????????????
???????磬????Purchaser??????????????????????????????????????AwesomePayments?????????
class Purchaser
def charge(purchase)
AwesomePayments.charge(purchase.customer.id??purchase.amount)
rescue => ex
try_again_later(purchase.id)
end
# ...
end
???????????????????????????????????????£????????????????????????????ò????????????????????AwesomePayments???????
class Purchaser
def initialize(awesome_payments = AwesomePayments)
@awesome_payments = awesome_payments
end
def charge(purchase)
@awesome_payments.charge(purchase.customer.id??purchase.amount)
rescue => ex
try_again_later(purchase.id)
end
end
???????????????????????AwesomePayments??????????????????????????????????????????????????????????С????????????????????????????????????????????????
??????????????????????????????????????????????£?????????????????????????
????С??
?????????β????????????????????????β????????????????QA????????????????????????????Σ?????????QA?????????????????Bug???????????????????????????д????????????????