2011-09-21 90 views
2

我正在爲我的IoC容器使用Ninject,並且正在嘗試編寫一些單元測試。我發現了Ninject Mocking Kernel,所以我想我會放棄它,但我無法通過最簡單的測試。我錯過了一些東西,需要一點幫助。Ninject.MockingKernel.Moq安全異常

Moq.4.0.10827.Final Ninject-2.2.0.0釋放淨4.0 Ninject.MockingKernel-2.2.0.0釋放淨4.0

我的單元測試...

[TestMethod] 
    public void Constructor_CanInitialize() 
    { 
     var kernel = new MoqMockingKernel(); 

     var mock = kernel.Get<IDataRepository>(); <--Error here 

     Assert.IsInstanceOfType(mock, typeof(DataRepository)); 
    } 

以下是錯誤...

試驗方法TestFixture.Constructor_CanInitialize拋出異常: System.TypeAccessException:嘗試通過安全透明的方法「Ninject.MockingKernel.Moq.MoqMockProvider.Create(Ninj ect.Activation.IContext)'訪問安全關鍵類型'Moq.Mock'失敗。

大會 'Ninject.MockingKernel.Moq,版本= 2.2.0.0,文化=中性公鑰= c7192dc5380945e7' 標有AllowPartiallyTrustedCallersAttribute程序,並使用2級安全透明度模型。級別2透明會導致AllowPartiallyTrustedCallers程序集中的所有方法默認情況下變爲安全透明,這可能是此異常的原因。

在Ninject.MockingKernel.Moq.MoqMockProvider.Create(IContext上下文)在C:\項目\ Ninject \ ninject.mockingkernel \ SRC \ Ninject.MockingKernel.Moq \ MoqMockProvider.cs:在Ninject.Activation線64 。在C:\ Projects \ Ninject \ ninject \中使用Context.Resolve():Ninject.KernelBase.b_ 7(IContext上下文)中的第157行 :c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ src \ Ninject \ KernelBase.cs:行375 在System.Linq.Enumerable。 <>Ç _DisplayClass12 3.<CombineSelectors>b__11(TSource x) at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() 在System.Linq.Enumerable.SingleOrDefault在C(IEnumerable的1 source) at Ninject.Planning.Targets.Target 1.GetValue(服務類型,IContext親本):\項目\ Ninject \ ninject \ SRC \ Ninject \規劃\目標\ Target.cs:線179 在Ninject.Planning.Targets.Target 1.ResolveWithin(IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs: line 147 at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs: line 97 at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass2.<Create>b__1(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs: line 81 at System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() 在System.Linq.Buffer 1..ctor(IEnumerable 1個源) 在System.Linq.Enumerable.ToArray(IEnumerable的1 source) at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs: line 80 at Ninject.Activation.Context.Resolve() in c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs: line 157 at Ninject.KernelBase.<Resolve>b__7(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs: line 375 at System.Linq.Enumerable.<>c__DisplayClass12 3.b__11(TSource x) at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b1 1.MoveNext() at System.Linq.Enumerable.Single(IEnumerable`1 source) at Ninject.ResolutionExtensions.Get(IResolutionRoot根,IParameter []參數)在C:\項目\ Ninject \ ninject \ SRC \ Ninject \語法\ ResolutionExtensions.cs:線37 在TestFixture.Constructor_CanInitialize()在TestFixture.cs:線32

+0

我已經縮小下來在.net v4的東西。如果我使用v3.5程序集,一切都按預期工作。 – oliwa

+0

也許你想看看下面的問題。 http://stackoverflow.com/questions/5055632/net-4-allowpartiallytrustedcallers-attribute-and-security-markings-like-securi –

回答

2

我已經現在一小會兒也要解決同樣的問題。 看到這個線程跟隨我的努力:https://groups.google.com/d/topic/ninject/xInlcd2b1l8/discussion

假設你正在使用的NuGet你有兩種選擇:

  • 不要使用Ninject.MockingKernel現在或
  • 建立它自己from source

任何您可能希望保留項目的選項卡,以便在更新版本可用時通過NuGet再次使用它。

0

遲到了,但這個工程:

var mock = kernel.GetMock<IDataRepository>();