我正在使用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行
答案 0 :(得分:2)
我一直在争论同样的问题。 请参阅此主题以跟进我的工作:https://groups.google.com/d/topic/ninject/xInlcd2b1l8/discussion
假设您正在使用NuGet,您有两种选择:
如果有更新版本,您可能希望在项目中保留一个标签,以便再次通过NuGet使用它。
答案 1 :(得分:0)
晚会,但这有效:
var mock = kernel.GetMock<IDataRepository>();