Ninject.MockingKernel.Moq安全异常

时间:2011-09-21 03:33:53

标签: ninject moq ninject-2

我正在使用Ninject作为我的IoC容器,我正在尝试编写一些单元测试。我找到了Ninject Mocking Kernel,所以我想我会试一试,但我无法通过最简单的测试。我错过了一些东西,需要一些帮助。

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(Ninject.Activation.IContext)'尝试访问安全关键类型'Moq.Mock'失败。

程序集'Ninject.MockingKernel.Moq,Version = 2.2.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'标有AllowPartiallyTrustedCallersAttribute,并使用2级安全透明模型。 2级透明度导致AllowPartiallyTrustedCallers程序集中的所有方法默认情况下变为透明,这可能是导致此异常的原因。

在C:\ Projects \ Ninject \ ninject.mockingkernel \ src \ Ninject.MockingKernel.Moq \ MoqMockProvider.cs中的Ninject.MockingKernel.Moq.MoqMockProvider.Create(IContext context):第64行 at Ninject.Activation.Context.Resolve()在c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Context.cs:第157行 在Ninject.KernelBase.b_ 7(IContext context)中的c:\ Projects \ Ninject \ ninject \ src \ Ninject \ KernelBase.cs:第375行 在System.Linq.Enumerable。&lt;&gt; c _DisplayClass12 3.<CombineSelectors>b__11(TSource x) at System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.SingleOrDefault(IEnumerable 1 source) at Ninject.Planning.Targets.Target 1.GetValue(类型服务,IContext父级)位于c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Planning \ Targets \ 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) 在System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b1 1.MoveNext() 在System.Linq.Enumerable.Single(IEnumerable`1 source) at Ninject.ResolutionExtensions.Get(IResolutionRoot root,IParameter []参数)在c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Syntax \ ResolutionExtensions.cs:第37行 在TestFixture.cs中的TestFixture.Constructor_CanInitialize():第32行

2 个答案:

答案 0 :(得分:2)

我一直在争论同样的问题。 请参阅此主题以跟进我的工作:https://groups.google.com/d/topic/ninject/xInlcd2b1l8/discussion

假设您正在使用NuGet,您有两种选择:

  • 现在不要使用Ninject.MockingKernel或
  • 自己构建from source

如果有更新版本,您可能希望在项目中保留一个标签,以便再次通过NuGet使用它。

答案 1 :(得分:0)

晚会,但这有效:

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