3.2 使用断言
3.2 使用斷言
在上面的示例中,我們使用了equalTo斷言,這是最基本的斷言之一。
僅使用equalTo斷言可以使您走得很遠,但是在某些情況下,還有許多其他斷言會派上用場。
認為Assertion [A]的是一個非常好的理解斷言的方法,該函數傳入一個A值并返回一個布爾值,該布爾值表示該值滿足斷言,否則返回false。
這不是確切實現斷言的方式,因為通過對值運行斷言而返回的數據類型需要包含一些其他信息以支持報告測試結果。
但是,這為您提供一個斷言的良好思考模型,類似于我們在上一章中研究的ZIO。zio.test包中的Assertion伴隨對象中有各種斷言。現在,我們僅提供一些示例來展示其功能。
斷言可以專用于特定的數據類型,因此存在各種斷言來表達更復雜的邏輯,這些邏輯對于我們而言可能更難直接實現。
例如,當使用集合時,我們可能要斷言兩個集合具有相同的元素,即使它們的顯示順序不同。
我們可以使用hasSameElements斷言輕松地做到這一點。
失敗斷言是另一個特別有用的斷言,它使我們能夠斷言一個效果因特定的值而失敗。 我們可以通過首先調用效果上的run來獲得一個ZIO效果,該效果以表示原始效果結果的Exit值成功,然后使用帶有該Exit值的fail斷言來使用。
object ExampleSpec extends DefaultRunnableSpec {def spec = suite("ExampleSpec")(testM("fails") {for {exit <- ZIO.effect(1 / 0).catchAll(_ => ZIO.fail(())).run} yield assert(exit)(fails(isUnit))})}您可能在這里注意到的另一件事是,許多斷言將其他斷言作為參數。這使您可以表達更具體的斷言,即在較大值的一部分上“置零”。
在上面的示例中,失敗聲明要求ZIO效果的結果為失敗,然后允許我們提供另一個參數以對該失敗值必須是什么做出更具體的聲明。在這種情況下,我們只使用了isUnit斷言,它是equalTo(())的簡寫,但是我們可以使用我們想要的任何斷言。
如果您到達某個位置時不關心特定的值,例如,您只關心效果失敗,而不關心效果如何失敗,則可以使用anything斷言來表示斷言結果為true。
關于斷言的另一個不錯的功能是我們可以使用邏輯合取,析取和否定來組合它們。
例如,假設我們要斷言一個整數集合至少具有一個值,并且所有值都大于或等于零。我們可以這樣做:
同樣,我們可以換一種表達方式。例如,我們期望一個集合為空或僅包含三個元素。
val assertion: Assertion[Iterable[Any]] = isEmpty || hasSize(equalTo(3))// assertion: Assertion[Iterable[Any]] = (isEmpty() || hasSize(equalTo(3)))我們還可以使用not表達否定斷言。例如,我們可以表示期望集合至少包含一個重復元素,如下所示:
val assertion: Assertion[Iterable[Any]] = not(isDistinct)// assertion: Assertion[Iterable[Any]] = not(isDistinct())總結
- 上一篇: stm32-Hardfault及内存溢出
- 下一篇: 找一份好工作只需要这几招