三相パターンでより良いテストを書く
(これはPracticing Railsからの短い抜粋です。ここでサインアップして最初の章を無料で入手してください!)
つまり、あなたは新しいアプリに取り組んでおり、Railsはあなたのためにテストを生成しました:
require 'test_helper'
class BugTest < ActiveSupport::TestCase
# test "the truth" do
# assert true
# end
end
コメントを外して名前を付ければ、テストを書く準備ができていますよね?しかし、それでは何ですか?最初に何を書きますか?テストコードはどのようになりますか?
単純なパターンに従うと、それらのスタブされたコード行が明確で構造化されたテストケースに変わります。
テストケースは次の3つのフェーズで機能する必要があります。
- 最初に、いくつかの設定(「配置」)を行います
- 次に、何かをします(「行為」)
- 次に、予想していたことが実際に発生したことを確認します。 (「アサート」)
たとえば、Rubyの配列でメソッドをテストしていると想像してください。このパターンに従うと、テストは次のようになります。
test "Array#sort will sort an array of numbers" do
# arrange
unsorted_array = [7, 4, 2, 3]
# act
sorted_array = unsorted_array.sort
# assert
assert_equal [2, 3, 4, 7], sorted_array
end
十分に単純です。 しかし、テストのすべての部分に行く場所があり、テストの各段階で、テストの書き方がほぼわかります。
場合によっては、アレンジフェーズが不要になるか、アクトフェーズとアサーションフェーズが組み合わされます。ただし、テストを作成するときに、3つのフェーズすべてについて考えることは依然として役立ちます。
アサートフェーズにはトリックがあります。アサートフェーズで使用したのと同じロジックを使用しないでください。 あなたは常に同じ答えへの2つの道をたどるべきです。それ以外の場合は、アサートフェーズで再度呼び出されるため、呼び出しているコードのバグに気付くことはありません。
たとえば、数学をしている場合:
test "average returns the average of a set of numbers" do
# arrange
numbers = [1, 2, 3, 4]
# act
average = numbers.average
# assert
# this is bad
assert_equal [1, 2, 3, 4].average, average
# this is better
assert_equal 2.5, average
end
[1, 2, 3, 4].average
を呼び出す average
であるため、Assertフェーズでも問題が発生します。 ほぼ何でも返すことができます そして、その主張は依然として通過するでしょう。
ここでは、それはかなり明確です。ただし、事態がさらに複雑になった場合でも、同じコードを2回実行するだけではないことを確認してください。それ以外の場合は、メソッドが呼び出されたことを確認するだけです。 、期待どおりに機能したわけではありません。
通常、回答への2番目のパスを取得する最も簡単な方法は、手動で回答を見つけてハードコードすることです。 もろい場合もありますが、気付かないうちにテストを中断するよりはましです。
なぜ3つのフェーズですか?
テストをこれらの3つのフェーズに分割すると、答える質問が簡単になります。 「このテストをどのように書くべきか」の代わりに、「このテストをどのように設定する必要があるか」、「何をテストするか」、「答えはどのように見えるか」という各フェーズに焦点を当てることができます。
>これらの質問にはまだ簡単な答えがないかもしれませんが、答えはテスト全体を一度に考えるよりもはるかに簡単です。また、運が良ければ、関連するテスト間でフェーズを共有することもできるため、次のテストの作成にかかる労力が大幅に軽減されます。
-
Swift3でアプリを作成する方法
Swiftは、macOSおよびiOSデバイス用のアプリを作成または作成するために使用されます。 AppleはSwiftを明示的に設計して、デバイスから最速かつ最も効率的なパフォーマンスを実現し、Swift3はすでに印象的な機能セットを拡張しています。 Swift4の新機能 「Swiftはわずか6か月前にオープンソースプロジェクトとしてリリースされました」と、Appleの言語およびランタイム担当シニアマネージャーであるTedKremenekは述べています。 「それを行うことの大部分は、GitHubに大量のソースをプッシュするだけでなく、Swiftの進化を推進する完全にオープンなコミュニ
-
Rubyのデコレータデザインパターン
デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli