के बीच अंतर को समझ नहीं सकते हैं, शुरू करने से पहले, मैं ऑटोफिक्चर का एक बड़ा प्रशंसक हूं, मैं अभी भी उपकरण का उपयोग करने के तरीके सीखने की वक्र में हूं। इसलिए विकसित ऑटोफिक्शन श्री प्लोहे और सभी योगदानकर्ताओं के लिए धन्यवाद।फ्रीज/इंजेक्ट/रजिस्टर
तो चलो मेरे प्रश्न से शुरू करते हैं।
AutoFixture/AutoMoq ignores injected instance/frozen mock
ऊपर के लिंक का दिलचस्प हिस्सा के अनुसार इस कोड
Mock<ISettings> settingsMock = new Mock<ISettings>();
settingsMock.Setup(s => s.Get(settingKey)).Returns(xmlString);
ISettings settings = settingsMock.Object;
fixture.Inject(settings);
जो मार्क उत्तर देने के लिए यह
fixture.Freeze<Mock<ISettings>>()
.Setup(s => s.Get(settingKey)).Returns(xmlString);
यह एक तरह लग रहा है फिर से लिखा जा सकता है दिया जाता है फ्रीज विधि का उपयोग करते हुए सिंटैक्सिक चीनी, झुकाव इंटरफ़ेस में नकली, कॉन्फ़िगरेशन और इंजेक्शन के निर्माण में लिखने का एक तरीका है ऑटोफिक्चर कंटेनर में।
वेब पर कुछ शोध करने के बाद, वास्तव में फ्रीज और इंजेक्ट के बीच एक कार्यात्मक अंतर होता है। मैं इस सवाल पाया: https://github.com/AutoFixture/AutoFixture/issues/59 जो How can I Freeze a null instance in AutoFixture
लिंक के लेखक का जवाब बात ऊपर निम्नलिखित के रूप में फ्रीज विधि का वर्णन:
आंतरिक रूप से, फ्रीज का अनुरोध प्रकार का एक उदाहरण बनाता है (उदाहरण के लिए IPayPalConfiguration) और फिर उसे इंजेक्शन तो वह हमेशा वापस आ जाएगी कि उदाहरण है जब आप इसे फिर से
मैं अंडर का अनुरोध टंड कि जब हम
var customer = fixture.Freeze<Order>();
जब भी हमारे कोड ऑर्डर प्रकार का अनुरोध करते हैं तो यह हमेशा आदेश के उसी उदाहरण का उपयोग करेगा। लेकिन अगर मैं फ्रीज कन्स्ट्रक्टर में निर्दिष्ट करता हूं तो मैं इसे एक विशिष्ट उदाहरण का उपयोग करना चाहता हूं?
[Fact]
public void MethodeName()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
fixture.Freeze<OrderLine>(new OrderLine("Foo"));
var order = fixture.Create<Order>();
}
public class Order
{
private readonly OrderLine _line;
public Order(OrderLine line)
{
_line = line;
}
}
public class OrderLine
{
private readonly string _name;
public OrderLine(string name)
{
_name = name;
}
}
ऑर्डर लाइन के नाम पर बराबर करने के लिए "फू" namefe48163a-d5a0-49a5-b349-7b11ba5f804b के बजाय नहीं होना चाहिए:
यह एक छोटा सा कोड उदाहरण है? फ्रीज विधि का दस्तावेज कहता है:
<typeparam name="T">The type to freeze.</typeparam>
<param name="fixture">The fixture.</param>
<param name="seed">Any data that adds additional information when creating the anonymous object. Hypothetically, this value might be the value being frozen, but this is not likely.</param>
लेखक को यह सुनिश्चित नहीं है कि मूल्य कब वापस किया जाता है? अगर मैं निर्दिष्ट करता हूं, फ्रीज के निर्माता में मेरा उदाहरण, मैं इस उदाहरण का उपयोग करने के लिए ऑटोफिक्चर की उम्मीद कर रहा हूं?
तो
कृपया ध्यान दें, जमे हुए मूल्य के रूप में प्रयोग की जाने वाली जब तक आप ऐसा करने के लिए अनुकूलित किया गया है संभावना नहीं है। यदि आप स्थिरता में एक विशिष्ट मान इंजेक्ट करना चाहते हैं, तो आपको इसके बजाय विधि का उपयोग करना चाहिए।
ऐसा लगता है कि मुझे बीज पैरामीटर को कस्टमाइज़ करना है। क्या कोई स्पष्टीकरण दे सकता है? प्रलेखन द्वारा इंगित समाधान इंजेक्ट विधि का उपयोग करना है। और वास्तव में, यह ऑर्डरलाइन के साथ मेरे कोड उदाहरण में काम करता है।
मैं फ्रीज, सुई के बीच अंतर को समझते हैं, और यह भी रजिस्टर जो, स्रोत कोड के अनुसार, बस इंजेक्षन विधि द्वारा कहा जाता है करने के लिए आपकी मदद के लिए देख रहा हूँ, लेकिन यह एक लैम्ब्डा लेता है।
बीटीडब्ल्यू। एक कारण यह है कि यह अधिभार अभी भी पाया जा रहा है यह तथ्य हो सकता है कि ReSharper डिफ़ॉल्ट रूप से 'EditorBrowsable' विशेषता को अनदेखा करने के लिए सेट किया गया प्रतीत होता है। ऑटोफिक्चर में – TeaDrivenDev
एफडब्ल्यूआईडब्ल्यू, मैं बीज अधिभार को दूर ले जाने (या दूर ले जाने की योजना बना रहा हूं: https://github.com/AutoFixture/AutoFixture/issues/151 –