2009-03-16 11 views
9

का उपयोग करके मजाक कर रहा हूं मैं मैक्स के लिए नया हूं और एक नकली ढांचे पर निर्णय ले रहा हूं। Moq home उद्धरण'पारंपरिक' रिकॉर्ड/रीप्ले बनाम मोक मॉडल

वर्तमान में, केवल मजाक पुस्तकालय कि सामान्यीकृत और कुछ हद तक unintuitive (विशेष रूप से के लिए novices) के खिलाफ जाता है रिकार्ड/अन्य सभी व्यवस्थाएं से दृष्टिकोण उत्तर है।

क्या कोई रिकॉर्ड कर सकता है कि रिकॉर्ड/रीप्ले दृष्टिकोण क्या है और कैसे मोक अलग है? प्रत्येक ढांचे का निर्णय लेने के बिंदु से विशेष रूप से प्रत्येक के पेशेवर और विपक्ष क्या हैं?

धन्यवाद।

उत्तर

7

रिकॉर्ड/रीप्ले दृष्टिकोण RhinoMocks द्वारा समर्थित है। मूल विचार यह है कि आपका परीक्षण निष्पादन दो चरणों, रिकॉर्ड चरण और रीप्ले चरण में बांटा गया है। थोड़ा और अधिक ठोस

var repo = new MockRepository(); 
var dependency = repo.DynamicMock<IDependency>(); 
With.Mocks(repo).Expecting(delegate { 
     Expect.Call(dependency.AMethod(1)).Return(result);      
     }).Verify(delegate { 
     var sut = new Sut(wrappee); 
     sut.DoStuffThatCallsAMethod(); 
     Assert.IsTrue(sut.ResultState); 
     }); 

होना करने के लिए तो उम्मीद ब्लॉक रिकार्ड चरण है और सत्यापित करें ब्लॉक खेलना चरण है।

इस कोड के Moq संस्करण होगा

var dependency = new Mock<IDependency>(); 
dependency.Expect(dep => dep.AMethod(1)).Returns(result);   
var sut = new Sut(wrappee.Object); 
sut.DoStuffThatCallsAMethod(); 
Assert.IsTrue(sut.ResultState); 

कौन सा रूप में आप देख सकते हैं ज्यादा पढ़ने के लिए अच्छे है। मैं राइनोमोक्स का उपयोग करता था लेकिन जब से मैंने मोक की खोज की तो मैं केवल मक का उपयोग करता हूं। मुझे लगता है कि यह अधिक पढ़ने योग्य कोड उत्पन्न करेगा। तो मेरी सलाह मोक के लिए जाना होगा।

+8

इस उत्तर मेरे लिए बहुत मतलब नहीं है। निश्चित रूप से, Moq संस्करण सरल है, लेकिन आपके पास अभी भी परीक्षण में उन दो चरणों हैं: रेखा 2 ("अपेक्षा" के लिए कॉल के साथ) "रिकॉर्ड" चरण से संबंधित है, जबकि पंक्तियां 3 और 4 "रीप्ले" चरण से संबंधित हैं । मुझे नहीं लगता कि सिंटैक्स में केवल अंतर "रिकॉर्ड/रीप्ले" मॉडल के लिए आवश्यक है। –

0

मैं रिकॉर्ड/रीप्ले से ठीक हो गया हूं क्योंकि यह सेटअप में देखना मुश्किल है जो स्टब किए गए/मॉक किए गए हैं या बस कोड चला रहे हैं। मुझे विश्वास है कि राइनो के काम करने के कई तरीके हैं। विशेष रूप से, आप अन्य कॉल से सेटअप को अलग करने के लिए using() ब्लॉक का उपयोग कर सकते हैं।

1

राइनोमोक्स वास्तव में बहुत बहुमुखी है, आप या तो दृष्टिकोण का उपयोग कर सकते हैं। RhinoMocks उम्मीद/सत्यापन शैली के तहत Moq से थोड़ा बेहतर दिखता है। हालांकि, यहां तक ​​कि तथ्य यह है कि आप इस शैली का उपयोग दस्तावेज में दफन कर चुके हैं (पिछली बार मैंने देखा)। हमने अपने वर्तमान प्रोजेक्ट पर राइनोमोक्स पर मोक चुना क्योंकि हमें एहसास नहीं हुआ कि यह सेटअप/सत्यापन करता है।

रिकॉर्ड/रीप्ले सिंटैक्स आपको उस मान को बदलने की क्षमता देता है जो विधि उस विधि के बाद की कॉल पर वापस आ जाएगी। यह कभी-कभी उपयोगी हो सकता है। ऐसा कहकर, ऐसा करने की आवश्यकता अक्सर एक गंध है कि आपका डिजाइन बिल्कुल सही नहीं है। यह उपयोगी है हालांकि जब आप देख सकते हैं कि क्या गलत है और आपको आगे बढ़ना है।

Moq मान परिवर्तित करने की क्षमता है, लेकिन यह (प्रलेखन से) कुछ हद तक भद्दा है

// returning different values on each invocation 
var mock = new Mock<IFoo>(); 
var calls = 0; 
mock.Setup(foo => foo.GetCountThing()) 
.Returns(() => calls) 
.Callback(() => calls++); 
संबंधित मुद्दे