2013-10-11 7 views
6

मैं AutoMoq उपयोग कर रहा हूँ लेकिन मैं थोड़े उलझन कैसे की वजह से मेरी पहली इकाई परीक्षण लिखने के लिए कर रहा हूँ इकाई की रूपरेखा के dbContextmockup कैसे करें इकाई की रूपरेखा 6 Moq और Autofixture साथ

// in service class(constructor) 
private readonly MyContext context; 

public PriceService(MyContext context) 
{ 
    this.context = context; 
} 

// following would be in nunit test method. 
var fixture = new Fixture().Customize(new AutoMoqCustomization()); 
var priceService = fixture.Create<PriceService>(); 

जब मैं (EF6 और पहले कोड का उपयोग कर) इकाई परीक्षण चलाने यह

 
    at Ploeh.AutoFixture.Kernel.TerminatingSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.AutoPropertiesCommand`1.Execute(Object specimen, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.MethodInvoker.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.c__DisplayClass6.b__1(ISpecimenBuilder b) 
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Linq.Enumerable.d__a5`1.MoveNext() 
    at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context, T seed) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context) 
    at PriceServiceTests.Test_Price_Object_Setup() in PriceServiceTests.cs:line 26 

संपादित

दुर्घटनाओं एफई 6 में जैसे वे DbSet अधिक mockable कर रहे हैं लगता है।

https://entityframework.codeplex.com/wikipage?title=Design%20Meeting%20Notes%20-%20May%2016%2c%202013

DbSet अधिक mockable

  • ये साधन एक संरक्षित निर्माता जोड़ने और तरीकों आभासी
  • नोट बनाने करें कि एक प्रकार DbSet से प्राप्त का उपयोग करता है की रक्षा की निर्माता एक ऑब्जेक्ट बनाना होगा किसी भी संदर्भ से बंधे नहीं हैं और विधियां नो-ऑप्स नहीं होंगी। यह टेस्ट डबल्स बनाने के परिप्रेक्ष्य से आईडीबीसेट की तरह बनाता है।
  • यदि हमने यह विकल्प लिया है तो हम संभावित रूप से अप्रचलित आईडीबीसेट
  • यह ध्यान देने योग्य है कि किसी भी मामले की पहचान नहीं की गई है जहां यह परीक्षण युगल के लिए आईडीबीसेट का उपयोग करने के लिए कार्यात्मक रूप से अलग होगा। हालांकि, समुदाय में मजबूत भावना है कि इंटरफेस को प्राथमिकता दी जाती है।

कोई भी जानता है कि इसे कैसे नकल करना है?

संपादित 2

मैं this article पाया लेकिन यह निम्न अपवादों के साथ

public class MyContext : DbContext 
{ 
    //public GroceryListContext() 
    // : base() 
    //{ 

    //} 
    public virtual DbSet<Price> Prices { get; set; } 
} 

[Test] 
public void Test_Price_Object_Setup_Properly() 
{ 
    var mockContext = new Mock<MyContext>(); 

    var mockSet = new Mock<DbSet<Price>>(); // had to add EF to my test solution. 
    mockContext.Setup(m => m.Prices).Returns(mockSet.Object); 
    var service = new PriceService(mockContext.Object); 

    // dies when using autofixture so thought try first moq like in article 
    //var priceService = fixture.Create<PriceService>(); 

    Assert.That(true, Is.EqualTo(false)); 
} 

क्रैश हो रहा है:

MyContext.Tests.Services.PriceServiceTests.Test_If_Price_Object_Setup_Properly: System.ArgumentException : Type to mock must be an interface or an abstract or non-sealed class. ----> System.TypeLoadException : Method 'Create' on type 'DbSet 1Proxyb409fc6b430b4568aac048b60ea2f02e 'विधानसभा से 'DynamicProxyGenAssembly2, संस्करण = 0.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = a621a9e7e5c32e69' ने कोशिश की कमजोर प्रकार पैरामीटर बाधाओं के साथ एक विधि को स्पष्ट रूप से ओवरराइड करें।

+1

संबंधित का समाधान हो सकता है। कॉम/प्रश्न/16696777/परीक्षण-साथ-एक-नकली-डीबीकॉनटेक्स्ट-एंड-ऑटोफिक्स्चर-एंड-मोक और http://stackoverflow.com/questions/14391146/using-autofixture-in-my-data-integration-tests- टू-बिल्ड-प्रॉक्सी और https://autofixture.codeplex.com/discussions/262557 प्रश्न: क्या आप अलग हैं कि ईएफ 6 वास्तव में 5 से अलग व्यवहार कर रहा है या आप बस पूर्ण होने की कोशिश कर रहे हैं? –

+0

आपके द्वारा प्रदान किया गया अंतिम उदाहरण, ऑटोफिक्चर के बिना कोई भी मेरी मशीन पर काम करता है। मैंने आपकी मूल्य सेवा, MyContext कक्षाएं और Test_Price_Object_Setup_Properly विधि की प्रतिलिपि बनाई है। मैंने अपनी खुद की प्राइस क्लास लागू की है क्योंकि आपने इसे प्रदान नहीं किया है और यह बिना किसी अपवाद के चलता है। मैं एंटिटी फ्रेमवर्क 6.0 आरसी 1 और विजुअल स्टूडियो 2013 आरसी का उपयोग कर रहा हूं। –

+0

@ रूबेनबार्टेलिंक ठीक है मेरा प्रश्न यह पता चला कि डेटाकॉन्टेक्स्ट को कैसे मजाक करना है, फिर मैंने पाया कि ईएफ डब्सेट पर मजाक कर सकता है और उसे रैपर की आवश्यकता नहीं है। ट्यूटोरियल करते समय मैं बड़ी समस्याओं में भाग गया। मुझे पता है कि यह ऑटोफिक्चर है कि समस्या थी, यह moq के संस्करण 3.0 स्थापित करता है लेकिन काम करने के लिए ट्यूटोरियल के लिए 4.0 की आवश्यकता होती है। मुझे यकीन नहीं है कि इस वजह से ऑटोफिक्चर का उपयोग करना संभव है। – chobo2

उत्तर

4

आप एक specification जो इंगित करता है कि DbSet<T> वर्ग मज़ाक उड़ाया जाना चाहिए (हालांकि यह एक सार प्रकार या इंटरफेस नहीं है) की आपूर्ति करने की जरूरत है।

इसका कारण यह है कि DbSet<T> कक्षा सार्वजनिक है लेकिन इसमें संरक्षित कन्स्ट्रक्टर है।

विशिष्टता:

internal class DbSetTypeSpecification : IRequestSpecification 
{ 
    public bool IsSatisfiedBy(object request) 
    { 
     var type = request as Type; 
     if (type == null) 
      return false; 

     return type.IsGenericType 
      && typeof(DbSet<>) == type.GetGenericTypeDefinition(); 
    } 
} 

उदाहरण:

[Fact] 
public void Test() 
{ 
    var fixture = new Fixture(); 
    fixture.ResidueCollectors.Add(
     new MockRelay(
      new DbSetTypeSpecification())); 

    Assert.DoesNotThrow(() => 
     fixture.Create<PriceService>()); 
} 

अब AutoFixture स्वत: जनरेट PriceService मान प्रदान कर सकते हैं।


कृपया ध्यान दें, कि MyContext वर्ग भी सार्वजनिक है और AFAICT यह एक सार्वजनिक निर्माता भी है। इसका मतलब यह है कि ऑटोफिक्चर डिफ़ॉल्ट रूप से MyContext कक्षा के लिए ऑटो-मॉक किए गए उदाहरण की आपूर्ति नहीं करेगा। http: // stackoverflow

(। आप अपने परिदृश्य प्रदान कर सकते हैं अगर मैं आगे मदद करने में सक्षम हो सकता है)

+0

क्या आपने ईएफ 6 के खिलाफ यह कोशिश की है? मुझे पता चला कि मेरे लिए कुछ भी क्यों काम नहीं कर रहा था ऑटोफिक्चर ने moq 3 स्थापित किया था और मुझे ट्यूटोरियल के लिए काम करने के लिए moq 4 की आवश्यकता थी। मैंने moq 4 और autofixture रखने की कोशिश की लेकिन फिर मैं कभी भी "उपयोग" की स्थिरता आयात नहीं कर सकता। – chobo2

+0

वैसे मैं केवल ऑटोफिक्चर में देख रहा हूं, पहले कभी इसका इस्तेमाल नहीं किया। मैं अपने परीक्षणों को स्थापित करना चाहता हूं इसलिए मुझे हाथों से सभी मॉक्स (moq के साथ) और डमी डेटा बनाने की ज़रूरत नहीं है। यही वह है जो मैं करने की कोशिश कर रहा हूं। मैं भी थोड़ा अस्पष्ट हूं जब मुझे अपने मॉक में कुछ निश्चित डेटा होने की आवश्यकता है (मान लें कि प्राइसऑब्जेक्ट में कीमत 5 होनी चाहिए) – chobo2

+0

@ chobo2 Moq के बारे में कृपया मेरा जवाब पढ़ें [ यहां] (https://autofixture.codeplex.com/Workitem/4260)। –

1

वहाँ एक NuGet पैकेज AutoFixture.AutoEF कहा जाता है जो आपकी समस्या

fixture.Customize(new EntityCustomization(new DbContextEntityTypesProvider(typeof(MyContext)))); 
संबंधित मुद्दे