最小起订量模拟通用 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 的签名以使其成为虚拟的将允许模拟按照您的预期工作,但您通常最好模拟接口而不是具体的。这说明了一个原因:您正在更改您的实现以使其可测试您的测试框架。