2012-08-24 25 views
6

मैं राइनो मोक्स के साथ एक विधि को कॉल ट्रैक करना चाहता हूं। के मैं इस कोड है मान लेते हैं:राइनो मोक्स, VerifyAllExpectations

public class A 
{ 
    protected IB _b; 

    public A(IB b) 
    { 
     _b = b; 
    } 

    public void Run(string name) 
    {    
     _b.SomeCall(new C { Name = name }); 
    } 
}  

public interface IB 
{ 
    void SomeCall(C c); 
}  

public class C 
{ 
    public string Name { get; set; } 
    // more attributes here 
} 

और की तरह परीक्षण दिखता है:

// prepare 
var bMock = Rhino.Mocks.MockRepository.GenerateStrictMock<IB>(); 
bMock.Expect(x => x.SomeCall(new C { Name = "myname" })); 
var sut = new A(bMock); 

// execute 
sut.Run("myname"); 

// assert 
bMock.VerifyAllExpectations(); 

परीक्षण क्योंकि राइनो Mocks ढांचा 2 अलग सी कक्षाओं का पता लगाता है एक ExpectedViolationException साथ विफल रहता है।

यदि परीक्षण के तहत विषय परीक्षण के तहत विधि में ऑब्जेक्ट पैरामीटर बनाता है तो मैं कॉल कैसे देखूं? पैरामीटर को "बराबर" के रूप में जांचने के लिए राइनो मोक्स को बताने का कोई मौका?

धन्यवाद एक टन!

उत्तर

12

मैं तुम्हें बहुत आसान (और अधिक maintainable) एएए सिंटैक्स का उपयोग की सलाह देते हैं। ज्यादातर मामलों में, सख्त मोजे किसी और चीज से अधिक दर्द होते हैं।

तर्क Equals का उपयोग करके तुलना की जाती हैं। यदि CEquals ओवरराइड नहीं करता है, तो इसकी तुलना संदर्भ से की जाती है और आपके मामले में मेल नहीं खाती है। किसी अन्य तरीके से तर्क की जांच के लिए Matches का उपयोग करें।

// arrange 
var bMock = MockRepository.GenerateMock<IB>(); 
var sut = new A(bMock); 

// act 
sut.Run("myname"); 

// assert 
bMock.AssertWasCalled(x => x.SomeCall(Arg<C>.Matches(y => y.Name == "myname")); 
+0

हाय, कंपाइलर कहता है: "लैम्ब्डा अभिव्यक्ति को 'Rhino.Mocks.Constraints.AbstractConstraint' टाइप करने के लिए परिवर्तित नहीं कर सकता क्योंकि यह एक प्रतिनिधि प्रकार नहीं है।" इंगित करना "x => x.Name =" myname "" – Jordi

+0

असाइनमेंट को बराबर (=) तुलना करने के लिए बराबर (==)। –

+0

अभी भी एक ही समस्या है। मुझे कुछ याद आ रही है? http://imageshack.us/f/708/errorah.png/ – Jordi

2

आप IgnoreArguments जोड़ने की जरूरत है और साथ ही 'SomeCall' के लिए कॉल के लिए पैरामीटर contraints जोड़ सकते हैं:

bMock.Expect(x => x.SomeCall(new C { Name = "myname" })) 
    .IgnoreArguments() 
    .Constraints(new PropertyConstraint(typeof(C), "Name", 
     Rhino.Mocks.Constraints.Is.Equal("myname"))); 
+0

धन्यवाद दोस्त! अच्छी चाल मैंने आज सीखा। वह मुद्दा मुझे हफ्तों तक परेशान कर रहा था। – Jordi

+1

यह वाक्यविन्यास पुराना है। आपको नए एएए सिंटैक्स का उपयोग करना चाहिए, जहां आपको अब स्ट्रिंग्स में प्रॉपर्टी नेम की आवश्यकता नहीं है। यदि आप अगली पंक्ति में तर्कों को अनदेखा करते हैं तो एक नया सी पास करने के लिए कोई उपयोग नहीं है। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^