最小起订量模拟通用 class
Moq mock generic class
我的代码中包含以下内容:
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
的 class
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);
在设置过程中,我得到以下信息:
Additional information: Invalid setup on a non-virtual (overridable in
VB) member: x => x.Create()
我做错了什么?
更新:
在我的代码中,我有以下内容:
var contact = m_someFactory.Create<IContact>(contact, Page.ID);
var organization = contact.Organization;
如果 Organization 是 Contact 中的接口,我该如何设置?
You can't Setup
a method that isn't virtual in Moq。此处,Factory.Create
未标记为虚拟。
更改 Create
的签名以使其成为虚拟的将允许模拟按照您的预期工作,但您通常最好模拟接口而不是具体的。这说明了一个原因:您正在更改您的实现以使其可测试您的测试框架。
我的代码中包含以下内容:
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
的 classpublic 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);
在设置过程中,我得到以下信息:
Additional information: Invalid setup on a non-virtual (overridable in VB) member: x => x.Create()
我做错了什么?
更新: 在我的代码中,我有以下内容:
var contact = m_someFactory.Create<IContact>(contact, Page.ID);
var organization = contact.Organization;
如果 Organization 是 Contact 中的接口,我该如何设置?
You can't Setup
a method that isn't virtual in Moq。此处,Factory.Create
未标记为虚拟。
更改 Create
的签名以使其成为虚拟的将允许模拟按照您的预期工作,但您通常最好模拟接口而不是具体的。这说明了一个原因:您正在更改您的实现以使其可测试您的测试框架。