【问题标题】:Create multiple instances of the same type with different behaviour in Moq (with Autofac)在 Moq 中创建具有不同行为的相同类型的多个实例(使用 Autofac)
【发布时间】:2015-04-13 02:36:16
【问题描述】:

我正在尝试对具有相同对象的 4 个实例的类编写单元测试(对象是硬件接口,类是硬件配置的管理器)。我用过 Autofac,所以我用的是 Autofac.Extras.Moq 库。

我需要有多个具有不同行为的模拟实例(基本上,我试图通过设置属性来测试设备发生故障时的行为。我正在努力,但我可以看到如何配置模拟来做什么我想要,但是当我改变行为时,它会改变该模拟的所有实例,而不仅仅是模拟。

using(mock = AutoMock.GetLoose())
{
    var goodHW = mock.Create<IHW>();
    ((Mock<IHW>)goodHW).Setup(x => x.OK).Returns(true);

    var badHW = mock.Create<IHW>();
    ((Mock<IHW>)badHW).Setup(x => x.OK).Returns(false);

    mock.Mock<IHWManager>().SetupGet(x => x.HW1).Returns(goodHW);
    mock.Mock<IHWManager>().SetupGet(x => x.HW2).Returns(badHW);

    Assert.AreNotEqual(goodHW, badHW) //FAILS!!!
}

由于这两个模拟实际上是同一个对象,goodHW 实例返回 false。我可以使用序列,但这会将测试逻辑与实现逻辑显着联系起来(调用顺序等)

我问的可能吗?

【问题讨论】:

  • 我猜这里,但你可以尝试创建两个mock 对象(调用GetLoose() 两次)并以不同的方式设置它们;然后使用一个创建goodHW,另一个创建badHW
  • 我曾考虑过这一点,但我认为可能有一种“干净”的方式来代替。如果不是,那几乎是我唯一的目标。
  • @Blorgbeard 您的解决方案运行良好。没坏,别修。输入答案,我会接受。

标签: c# unit-testing moq autofac


【解决方案1】:

您可以尝试创建两个模拟对象(调用GetLoose()twice)并进行不同的设置;然后使用一个创建goodHW,另一个创建badHW

类似这样的:

using(mockGood = AutoMock.GetLoose())
using(mockBad = AutoMock.GetLoose())
{
    var goodHW = mockGood.Create<IHW>();
    ((Mock<IHW>)goodHW).Setup(x => x.OK).Returns(true);

    var badHW = mockBad.Create<IHW>();
    ((Mock<IHW>)badHW).Setup(x => x.OK).Returns(false);

    mockGood.Mock<IHWManager>().SetupGet(x => x.HW1).Returns(goodHW);
    mockBad.Mock<IHWManager>().SetupGet(x => x.HW2).Returns(badHW);

    Assert.AreNotEqual(goodHW, badHW) // SUCCESS??
}

【讨论】:

    猜你喜欢
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多