在我的代码中包含以下内容:
var contact = m_someFactory.Create<IContact>(contact, Page.ID);
来自工厂的代码:
ObjectFactory实现AbstractFactory
ObjectsFactory : AbstractFactory
{
public T Create<T>()
{
var factory = this as IInsertFactoryMethod<T>;
return factory != null
? factory.Create()
: default(T);
}
我希望能够嘲笑这个。 我创建了一个实现IContact
的类public class Contact{
public Name {get; set;}
IOrganization Organization { get; set; }
}
对于设置我尝试了这个:
FactoryMock = new Mock<ObjectsFactory>();
FactoryMock.Setup(x => x.Create<IContact>()).Returns(new Mock<IContact>().Object);
和这个
FactoryMock.Setup(x => x.Create<IContact>(null, It.IsAny<int>())).Returns(new Mock<IContact>().Object);
在设置过程中,我得到以下内容:
其他信息:非虚拟设置无效(可覆盖的 VB)成员:x =&gt; x.Create()
我做错了什么?
更新: 在我的代码中,我有以下内容:
var contact = m_someFactory.Create<IContact>(contact, Page.ID);
var organization = contact.Organization;
如果“组织”是“联系人”中的界面,我该如何设置?
答案 0 :(得分:1)
You can't Setup
a method that isn't virtual in Moq。此处,Factory.Create
未标记为虚拟。
更改Create
的签名以使其成为虚拟将允许模拟按照您的意图工作,但通常最好不要模拟接口而不是混凝土。这说明了一个原因:您正在更改实现,以使其可以测试您的测试框架。