2012-02-10 16 views
5

मैं Moq और TDD के साथ नया हूं और मैं जो करने की कोशिश कर रहा हूं वह रिपोजिटरी इंटरफ़ेस पर विधि सेट अप करना है।Moq फ्रेमवर्क Func <T,T>

यहां पूरी कहानी है।

मैं

public class Tenant:EntityBase<Tenant>,IAggregateRoot 
{ 
... 
public string BusinessIdentificationNumber {get;set;} 
... 
} 

अगला मैं इस इकाई इंटरफेस है, जिसके लिए भंडार है

तरह
public interface IRepository<T> 
{ 
... 
T FindBy(Func<T,bool> func); 
... 
} 

जहां समस्या है, मैं एक डोमेन सेवा का उपयोग एक डोमेन इकाई संपत्ति BusinessIdentificationNumber साथ किरायेदार बुलाया वर्ग है जिसमें किरायेदार बनाने के नियम हैं और

public class TenantCreationService:ITenantCreationService 
{ 
    public TenantCreationService(IRepository<Tenant> tenantRepository){...} 

    public void CreateTenant(Tenant tenant) 
    { 
     //from here there is call to IRepository<Tenant>.FindBy(funcMethod); 
    } 
} 

और इकाई परीक्षण में मैं कहाँ TenantCreationService मैं भंडार निर्माता के लिए पारित नकली परीक्षण कर रहा हूँ, लेकिन मैं सुविधा का परीक्षण करना चाहते हैं:

  • जब BusinessIdentificationNumber साथ किरायेदार पहले से ही भंडारण या सत्र में मौजूद है यह किया जाना चाहिये।

तो मैं जैसे

repositoryMock.Setup(x=>x.FindBy(It.Is<Tenant>(t=>t.BusinessIdentificationNumber 
    == _tenantInTest.BusinessIdentificationNumber))).Returns(_tenantInTest) 

यह करने के लिए कोशिश कर रहा था, लेकिन यह संकलन नहीं है। आप जानते हैं कि मैं क्या करना चाहता हूं?

संपादित करें: "। जब BusinessIdentificationNumber साथ किरायेदार पहले से ही भंडारण या सत्र में मौजूद है यह वापस आ जाना चाहिए" जब मैं नीचे

repositoryMock.Setup(e => e.FindBy(t => t.BusinessNumber == _validTenant.BusinessNumber)).Returns(
       _validTenant); 

मैं अपवाद

Unsupported expression: t => (t.BusinessNumber == value(DP.IPagac.UnitTests.DP.IPagac.Module.TenantManagement.TenantDomainServiceTests)._validTenant.BusinessNumber) 
+0

आप अपने प्रश्न में संकलन त्रुटि शामिल कर सकते हैं? –

उत्तर

6

मुझे लगता है कि आप प्राप्त यह (कुछ चीजें हैं जो उदाहरण के लिए बाहरी थे और ITenent बनाया तो यह गतिशील रूप से मज़ाक उड़ाया जा सकता है हटा दिया) है कोशिश कर रहे हैं:

[TestFixture] 
public class Test 
{ 
    [Test] 
    public void CreateTenentAlreadyExistsTest() 
    { 
     var tenentMock = new Mock<ITenant>(); 
     var repoMock = new Mock<IRepository<ITenant>>(); 

     tenentMock.Setup(t => t.BusinessIdentificationNumber).Returns("aNumber"); 

     repoMock.Setup(r => r.FindBy(It.Is<System.Func<ITenant, bool>>(func1 => func1.Invoke(tenentMock.Object)))).Returns(tenentMock.Object); 

     var tenantCreationService = new TenantCreationService(repoMock.Object); 

     tenantCreationService.CreateTenant(tenentMock.Object); 

     tenentMock.VerifyAll(); 
     repoMock.VerifyAll(); 
    } 
} 

public interface ITenant 
{ 
    string BusinessIdentificationNumber { get; set; } 
} 

public class Tenant : ITenant 
{ 
    public string BusinessIdentificationNumber { get; set; } 
} 

public interface IRepository<T> 
{ 
    T FindBy(System.Func<T, bool> func); 
} 

public class TenantCreationService : ITenantCreationService 
{ 
    private readonly IRepository<ITenant> _tenantRepository; 

    public TenantCreationService(IRepository<ITenant> tenantRepository) 
    { 
     _tenantRepository = tenantRepository; 
    } 

    public void CreateTenant(ITenant tenant) 
    { 
     var existingTenant = 
      _tenantRepository.FindBy(t => t.BusinessIdentificationNumber == tenant.BusinessIdentificationNumber); 

     if (existingTenant == null) 
     { 
      //do stuff 
     } 
    } 
} 

public interface ITenantCreationService 
{ 
    void CreateTenant(ITenant tenant); 
} 
+0

हां, आपको इसे Findby विधि पर कॉल के साथ मिला है। मुझे लगता है कि आप समझते हैं कि मैं क्या करने की कोशिश करता हूं, लेकिन आपका कोड मुझ पर संकलित नहीं हुआ। मुझे एक असमर्थित अपवाद टी => (टी। बिजनेस नम्बर == मान) मिला।व्हाटिम हासिल करने की कोशिश कर रहा है कि विशिष्ट व्यापार संख्या के साथ किरायेदार के साथ खोजकर्ता को फोन करने पर विशिष्ट किरायेदार वापस लौटाया जाना चाहिए (पाठ्यक्रम का परीक्षण करने के लिए)। – Ivan

+0

क्या आपको नवीनतम MOQ मिला है? फ्रेमवर्क का आप किस संस्करण का उपयोग कर रहे हैं? उपरोक्त संकलन और मेरे वर्कस्टेशन verbatim पर परीक्षा उत्तीर्ण करता है। –

+0

क्षमा करें मैंने आपको पोस्ट संपादित नहीं किया है। अब यह काम कर रहा है – Ivan

0

मिल टुकड़ा संकलन करने की कोशिश - इस परीक्षण विवरण से मुझे समझ में आया कि इस व्यवहार से आपको सर्विस क्लास

सेवाओं के लिए यूनिट परीक्षण में डेटा एक्सेस लेयर का परीक्षण नहीं करना चाहिए, मेरा मतलब है कि आपकी रिपॉजिटरीज, आपको केवल यह सत्यापित करना चाहिए कि रिपॉजिटरी विधि FindBy बुलाया गया था। और मेरा सुझाव ITenantRepositry बनाएं जो आईरिपोजिटरी इंटरफेस से और बेस क्लास रिपोस्टरी से प्राप्त होता है।

+0

लेकिन यह सेवा वर्ग में व्यावसायिक व्यवहार है। मैं डेटाबेस से डेटा लाने के लिए केवल भंडार का उपयोग करता हूं। पूरे परीक्षण को CreateTenant_TenantWithSameIdAlreadyExist_ShouldThrowException() कहा जाता है [और कार्यान्वयन विवरण के बारे में वाक्य केवल dev उद्देश्य के लिए है, आपको यहां व्यवसाय पेश करने के लिए समझ में नहीं आता है।]; मैं रिपोजिटरी व्यवहार का परीक्षण नहीं कर रहा हूं, लेकिन मैं रिपॉजिटरी को इस तरह से मॉक करना चाहता हूं कि सेवा पर CreateMethod को कॉल करने पर (और यह कॉल को रिपोजिटरी में कॉल करता है) पूर्वनिर्धारित स्थिति (BusinessID == "123") के साथ इसे बनाए गए किरायेदार को वापस करना चाहिए testfixturesetup – Ivan

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