का परीक्षण कानून मैं एपीआई के माध्यम से वेब सेवा तक पहुंचने के लिए एक लाइब्रेरी लिख रहा हूं। मैं एपीआई कार्रवाईसाइड-इफेक्टिंग मोनड
case class ApiAction[A](run: Credentials => Either[Error, A])
प्रतिनिधित्व करने के लिए साधारण क्लास परिभाषित किया है और कुछ कार्यों कि वेब सेवा करता कॉल
// Retrieve foo by id
def get(id: Long): ApiAction[Foo] = ???
// List all foo's
def list: ApiAction[Seq[Foo]] = ???
// Create a new foo
def create(name: String): ApiAction[Foo] = ???
// Update foo
def update(updated: Foo): ApiAction[Foo] = ???
// Delete foo
def delete(id: Long): ApiAction[Unit] = ???
मैं भी ApiAction
एक इकाई द्वारा किए गए
implicit val monad = new Monad[ApiAction] { ... }
तो मैं कर सकता
create("My foo").run(c)
get(42).map(changeFooSomehow).flatMap(update).run(c)
get(42).map(_.id).flatMap(delete).run(c)
जैसे कुछ करें
अब मैं मुसीबतों अपनी इकाई कानूनों का परीक्षण
val x = 42
val unitX: ApiAction[Int] = Monad[ApiAction].point(x)
"ApiAction" should "satisfy identity law" in {
Monad[ApiAction].monadLaw.rightIdentity(unitX) should be (true)
}
क्योंकि monadLaw.rightIdentity
equal
def rightIdentity[A](a: F[A])(implicit FA: Equal[F[A]]): Boolean =
FA.equal(bind(a)(point(_: A)), a)
का उपयोग करता है और वहाँ कोई Equal[ApiAction]
है।
[error] could not find implicit value for parameter FA: scalaz.Equal[ApiAction[Int]]
[error] Monad[ApiAction].monadLaw.rightIdentity(unitX) should be (true)
[error] ^
समस्या मैं कल्पना भी नहीं कर सकते हैं कि यह कैसे Equal[ApiAction]
को परिभाषित करना संभव हो सकता है। ApiAction
एक कार्य अनिवार्य है, और मुझे कार्यों पर किसी भी समानता संबंध के बारे में पता नहीं है। बेशक ApiAction
चलाने के परिणामों की तुलना करना संभव है, लेकिन यह वही नहीं है।
मुझे लगता है कि मैं कुछ गलत कर रहा हूं या कुछ आवश्यक समझ नहीं पा रहा हूं। तो मेरे प्रश्न हैं:
- क्या यह
ApiAction
के लिए एक मोनड होने के लिए समझ में आता है? - क्या मैंने
ApiAction
सही बनाया है? - मुझे अपने मोनैड कानूनों का परीक्षण कैसे करना चाहिए?
अनंत डोमेन वाले कार्यों के लिए कोई गणना योग्य समानता संबंध नहीं है। आप एक सीलबंद विशेषता के एक अमूर्त विधि को 'रन' बना सकते हैं, और फिर अपने 'अपियाक्शन' को व्युत्पन्न केस क्लास और केस ऑब्जेक्ट्स के रूप में कार्यान्वित कर सकते हैं। –