2015-07-21 70 views
4

我剛剛安裝了VS2015,它同時安裝了.NET Framework 4.6,並且突然AutoFixture 3.30.8無法創建Claim對象。 我猜有新的.NET Framework版本4.6在AutoFixture內引起一些問題。AutoFixture無法創建聲明(使用.NET Framework 4.6)

我創建包含在VS2013以下代碼一個測試項目(靶向的.NET Framework 4.5.1):

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Ploeh.AutoFixture; 

namespace AutoFixtureTester 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void CanCreateClaim() 
     { 
      var fixture = new Fixture(); 
      fixture.Behaviors.Add(new OmitOnRecursionBehavior()); 

      var claim = fixture.Create<System.Security.Claims.Claim>(); // exception here 

      Assert.IsNotNull(claim); 
     } 
    } 
} 

的誤差如下:

Ploeh.AutoFixture.ObjectCreationException: AutoFixture was unable to create an instance from System.IO.Stream, most likely because it has no public constructor, is an abstract or non-public type. 

Request path: 
     System.Security.Claims.Claim --> 
      System.IO.BinaryReader reader --> 
      System.IO.BinaryReader --> 
      System.IO.Stream input --> 
      System.IO.Stream 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.SeedIgnoringRelay.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.ParameterRequestRelay.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.MethodInvoker.<>c__DisplayClass2.<Create>b__0(ParameterInfo pi) 
    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.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.SeedIgnoringRelay.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.ParameterRequestRelay.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.MethodInvoker.<>c__DisplayClass2.<Create>b__0(ParameterInfo pi) 
    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.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.Kernel.SeedIgnoringRelay.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.AutoPropertiesTarget.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.BehaviorRoot.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Fixture.Create(Object request, ISpecimenContext context) 
    at Ploeh.AutoFixture.Kernel.SpecimenContext.Resolve(Object request) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context, T seed) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenBuilder builder) 
    at AutoFixtureTester.UnitTest1.CanCreateClaim() in D:\Sandbox\AutoFixtureTester\AutoFixtureTester\UnitTest1.cs:line 16 

安裝VS2015之前,該創建一個Claim對象用於工作的方式。其實我把這個解決方案發給我的同事,他只安裝了VS2013,並且適用於他。

我注意到F12-導航到Claim代碼顯示了來自4.5.1 DLL的元數據。 VS2015安裝程序是否存在4.5.1 DLL的問題?或者這可能是AutoFixture中安裝4.6出土的錯誤?


我比較了我同事的一個System.Security.Claims.Claim DotPeek輸出我的機器。他的表演:

// Assembly location: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\mscorlib.dll 

其中礦山表明:

// Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll 

他有5個構造採取任何string S或ClaimsIdentity
礦井有7層構造,包括2塊新的,看起來像這樣:

public Claim(BinaryReader reader) { ... } 

public Claim(BinaryReader reader, ClaimsIdentity subject) { ... } 

我想這種情況的解決方法是將某種方式強制AutoFixture使用特定的構造函數。但是這讓我感到緊張,這個突破性變化已經在微軟的網絡中滑落。還有其他的改變嗎?

+0

根據文檔,Stream可能在System.IO.dll 4.6版本中。這是非常不清楚的。 – leppie

+1

相關:http:// stackoverflow。com/questions/12721757 /這是什麼系統 - io-dll的點 - – leppie

回答

3

作爲讓AutoFixture像以前一樣工作的解決方法,我定製了它創建Claim的方式來選擇參數最多的構造函數。

fixture.Customize<System.Security.Claims.Claim>(
    c => c.FromFactory(new MethodInvoker(new GreedyConstructorQuery()))); 

此問題的原因似乎是安裝4.6已影響到4.5.1 DLL。 Claim現在有7個構造函數,並且2個新的構造函數採用BinaryReader參數,該參數取決於不能由AutoFixture構造的Stream。幸運的是,AutoFixture很好,可配置:)

如上所述,它讓我感到緊張,這個突破性的變化已經在微軟的網絡中滑落。另外它讓我感到擔心的是,如果他們決定在將來添加另一個構造函數到Framework 4.7,並且需要20個參數(包括BinaryReader),那麼我們將再次爬上這條河。

+1

我確信微軟並不認爲這是一個突破性的改變。以前使用'claim'的普通代碼將繼續像以前一樣編譯和工作;增加一個班級的新成員並不構成重大改變。 AutoFixture中斷的原因是它從不知道*如何創建一個'Claim'實例。除了少數知名的BCL類型之外,AutoFixture不知道如何創建各種類型的對象,而是使用**盡力而爲的啓發式**來創建對象。當框架發生變化時,預計會出現像這樣的偶爾打嗝;有時,它可能會以另一種方式。 –

+0

謝謝馬克。我想我確實同意添加這些構造函數不應該導致任何內容被破壞。讓我感到困惑的是安裝4.6改變4.5.1的行爲。但我想這可能隨時隨Windows Update發生,這只是我們需要注意的事情。 – demoncodemonkey

+0

@demoncodemonkey我知道這已經有一段時間了,這是否會導致你的問題? –