Moq模拟泛型类

时间:2016-02-09 21:15:53

标签: c# .net moq

在我的代码中包含以下内容:

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;

如果“组织”是“联系人”中的界面,我该如何设置?

1 个答案:

答案 0 :(得分:1)

You can't Setup a method that isn't virtual in Moq。此处,Factory.Create未标记为虚拟。

更改Create的签名以使其成为虚拟将允许模拟按照您的意图工作,但通常最好不要模拟接口而不是混凝土。这说明了一个原因:您正在更改实现,以使其可以测试您的测试框架。