【问题标题】:Moq property of an object specified by an Interface接口指定的对象的 Moq 属性
【发布时间】:2016-02-09 20:04:51
【问题描述】:

有没有办法最小化接口公开的对象的属性?

拥有:

interface IMyInterface {
   CurrentContact CurrentContact { get; }
}

Contact 类有一个字段“BirtDate”,它在代码中的某处使用,因此需要模拟

public class CurrentContact : ContactEntity
  {
    public IEnumerable<CustomerAddress> ContactAddresses { get; }
    public Organization ContactOrganization { get; }
...

所以我这样做:

customerContextMock = new Mock<IMyInterface>();
customerContextMock.Setup(x => x.CurrentContact.BirthDate)
                .Returns(new CustomerContact {BirthDate = DateTime.MaxValue}.BirthDate);

但是我得到以下错误

附加信息:非虚拟设备上的无效设置(可在 VB) 成员:x => x.CurrentContact.BirthDate

有没有在不添加这个(以及任何其他字段)的情况下模拟这个,我需要将 moq 作为属性添加到 IMyInterface?

【问题讨论】:

  • 你能显示Contact类吗?
  • 它是一个第三方库,包含一堆非虚拟的 get{} 属性
  • 你不能模拟非虚拟属性。但是,如果它们有设置器,您可以设置它们。
  • 现在您的属性CurrentContact 缺少类型
  • 有没有办法创建一个继承 CurrentContact 并使用“new”关键字添加 setter 的 Fake?那行得通吗?

标签: c# .net moq


【解决方案1】:

我建议在您的代码中创建一个接口IContact,其中包含您需要来自第三方Contact 类的所有属性。然后使用Adapter Pattern 连接到Contact 类。最后你可以模拟整个IContact 接口。这种方法还有一个很大的优势,即您在整个应用程序中独立于第三方Contact 类,但在联系人适配器类中除外。

更详细地说,这可能看起来像这样:

public interface IMyInterface
{
  IContact CurrentContact { get; }
}

public interface IContact
{
  DateTime BirthDate { get; }
  // define more needed properties here
}

public class ContactAdapter : IContact
{
  private readonly Contact _contact;

  public ContactAdapter(Contact contact)
  {
    _contact = contact;
  }

  public DateTime BirthDate
  {
    get { return _contact.BirthDate; }
  }

  // delegate more properties to third party Contact class
}

所以你可以用类似这样的东西来模拟整个IContact

var contactMock = new Mock<IContact>();
contactMock.Setup(c => c.BirthDate).Returns(DateTime.MaxValue);

作为最后一步,您必须连接IContact 接口以在生产代码中使用ContactAdapter。正如您在上面看到的,ContactAdapter 获取第三方Contact 类作为构造函数参数。 理想情况下,您会使用 IoC 容器来设置布线。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2021-07-10
    • 1970-01-01
    • 2021-12-09
    • 2013-06-02
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多