MS Fakes 错误 CS0117:Stub[ClassName] 不包含 [delegate 属性 name] 的定义,即使元数据表明它存在
MS Fakes Error CS0117 : Stub[ClassName] does not contain a definition for [delegate property name] even though metadata says it's there
我遇到一个问题,即 MS Fakes 没有将几个委托属性添加到 fakes 程序集,即使它们出现在元数据中也是如此。
我有一个 class A
继承自抽象泛型 class B<T>
并实现接口 IA
。除了 T
之外的所有内容都在同一个命名空间中定义,并且都在同一个程序集中。
B
有一个方法 (BMethod
) 并且 IA
定义了一个在 A
.[=41= 中实现的方法 (IAMethod
) ]
在我的测试项目中,我为包含这些 classes/interfaces 的项目添加了一个伪造的程序集。我已经指定 fakes 程序集应该只为 class A
添加一个存根作为 StubA
,默认情况下也会将接口 IA
作为 StubIA
存根。
创建 StubA
的实例时,我可以将函数定义分配给从 class B
创建的所有委托,但我无法引用委托 属性 名称对于 A
中定义的功能以及 IA
的合同要求的功能。 (例如,我可以引用和分配 StubA.BMethodArgType
,但不能引用和分配 StubA.IAMethodArgType
)
当我在 VS2015 中导航到 StubA
的定义时,我可以看到 VS 告诉我缺少的属性实际上存在于元数据中。
...
public class StubA : A, IStub<A>, IStub, IStubObservable, IPartialStub
{
...
//
// Summary:
// Sets the stub of B`1.BMethod(ArgType arg)
public FakesDelegates.Func<ArgType, ReturnType> BMethodArgType;
//
// Summary:
// Sets the stub of A.IAMethod(ArgType arg)
public FakesDelegates.Func<ArgType, ReturnType> IAMethodArgType;
...
}
...
但是当我打开 FakesAssemblies/ProjectName.Fakes.xml 时,我没有看到为 StubA
定义的 IAMethodArgType
成员,但我确实看到 [=] 的成员32=] 在 StubIA
中定义,存根接口。此外,如果我将 Interfaces="false"
属性添加到 ProjectName.fakes 中的 Add
标记,ProjectName.Fakes.xml 文件将不再包含 IAMethodArgType
.[= 的成员41=]
尽管如此,我仍收到错误 CS0117,无法构建我的测试项目。我已经尝试清除我的 FakesAssembly 文件夹并重建。我尝试删除所有伪造的程序集引用并将它们重新添加进去。我尝试制作 IAMethod
实现 virtual
。似乎没有任何帮助。
任何人都可以告诉我可能发生了什么,或者我可以在哪里检查以了解为什么会发生这种情况?
好的,所以我将其发布在这里以防其他人遇到这种头痛,但问题似乎是 A
中 IA
方法的实现确实需要virtual
用于存根以使用它们。当我最初制作它们 virtual
时,我看到的是元数据和实际构建之间的滞后,所以看起来它们仍然不在元数据中,即使它们实际上已经被构建过程拾取并且不再产生错误 CS0117
我遇到一个问题,即 MS Fakes 没有将几个委托属性添加到 fakes 程序集,即使它们出现在元数据中也是如此。
我有一个 class A
继承自抽象泛型 class B<T>
并实现接口 IA
。除了 T
之外的所有内容都在同一个命名空间中定义,并且都在同一个程序集中。
B
有一个方法 (BMethod
) 并且 IA
定义了一个在 A
.[=41= 中实现的方法 (IAMethod
) ]
在我的测试项目中,我为包含这些 classes/interfaces 的项目添加了一个伪造的程序集。我已经指定 fakes 程序集应该只为 class A
添加一个存根作为 StubA
,默认情况下也会将接口 IA
作为 StubIA
存根。
创建 StubA
的实例时,我可以将函数定义分配给从 class B
创建的所有委托,但我无法引用委托 属性 名称对于 A
中定义的功能以及 IA
的合同要求的功能。 (例如,我可以引用和分配 StubA.BMethodArgType
,但不能引用和分配 StubA.IAMethodArgType
)
当我在 VS2015 中导航到 StubA
的定义时,我可以看到 VS 告诉我缺少的属性实际上存在于元数据中。
...
public class StubA : A, IStub<A>, IStub, IStubObservable, IPartialStub
{
...
//
// Summary:
// Sets the stub of B`1.BMethod(ArgType arg)
public FakesDelegates.Func<ArgType, ReturnType> BMethodArgType;
//
// Summary:
// Sets the stub of A.IAMethod(ArgType arg)
public FakesDelegates.Func<ArgType, ReturnType> IAMethodArgType;
...
}
...
但是当我打开 FakesAssemblies/ProjectName.Fakes.xml 时,我没有看到为 StubA
定义的 IAMethodArgType
成员,但我确实看到 [=] 的成员32=] 在 StubIA
中定义,存根接口。此外,如果我将 Interfaces="false"
属性添加到 ProjectName.fakes 中的 Add
标记,ProjectName.Fakes.xml 文件将不再包含 IAMethodArgType
.[= 的成员41=]
尽管如此,我仍收到错误 CS0117,无法构建我的测试项目。我已经尝试清除我的 FakesAssembly 文件夹并重建。我尝试删除所有伪造的程序集引用并将它们重新添加进去。我尝试制作 IAMethod
实现 virtual
。似乎没有任何帮助。
任何人都可以告诉我可能发生了什么,或者我可以在哪里检查以了解为什么会发生这种情况?
好的,所以我将其发布在这里以防其他人遇到这种头痛,但问题似乎是 A
中 IA
方法的实现确实需要virtual
用于存根以使用它们。当我最初制作它们 virtual
时,我看到的是元数据和实际构建之间的滞后,所以看起来它们仍然不在元数据中,即使它们实际上已经被构建过程拾取并且不再产生错误 CS0117