gpt4 book ai didi

c# - Moq:模拟具有多重继承的类

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:44 24 4
gpt4 key购买 nike

关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

5年前关闭。




Improve this question




我正在对遗留代码进行一些测试(这里的意思是“没有单元测试的代码”)。有时会遵循良好的做法,但通常不会。不过,我无法弄清楚在这种情况下需要做什么。

我需要能够在一个具体的类中测试我想要的方法,但是因为在我正在测试的类的构造函数中,它不仅有我可以模拟的接口(interface)参数,而且它还继承自另一个具有自己依赖关系的基类。

我要测试的方法是 FilterController.SomeMethod(whatever_params)。 FilterController 继承自 BaseController。我已经添加了一个简单的接口(interface) IFilterController 以使其 FilterController 继承自 BaseController 和 IFilterController。我在界面中拥有的唯一方法是我要测试的方法(“SomeMethod”)。

现在,FilterController 的构造函数是我在跳转到 BaseController 时遇到问题的地方。

public interface IFilterController { ActionResult SomeMethod(string s, bool b) }

public class FilterController : BaseController, IFilterController {
public FilterController(IFoo1 foo1, IFoo2 foo2, IFoo3 foo3, IFoo4 foo4)
: base(typeof(FilterController), foo1, foo2, foo3, foo4) {}
public ActionResult SomeMethod(string s, bool b) { // implementation }


// and the BaseController...
public BaseController(Type type, IFoo1 foo1, IFoo2 foo2, IFoo3 foo3, IFoo4 foo4)
{
// call that blows up due to not knowing how to mock the call inside here
_somePrivateProperty = _someOtherInterface.someCallThatIsntMocked(some_params)
// other stuff
}

我目前尝试设置单元测试的代码(带有 FluentAssertions 和 Moq 的 MSTest):
    private FilterController filterController;
private Mock<IFilterController> filterControllerMock;
private Mock<IFoo1> foo1mock;
private Mock<IFoo2> foo2mock;
private Mock<IFoo3> foo3mock;
private Mock<IFoo4> foo4mock;

[ClassInitialize]
public static void ClassInit(TestContext context) {}

[TestInitialize]
public void Initialize()
{
filterControllerMock = new Mock<IFilterController>();
foo1mock = new Mock<IFoo1>();
foo2mock = new Mock<IFoo2>();
foo3mock = new Mock<IFoo3>();
foo4mock = new Mock<IFoo4>();

// here is where the test bombs out with exceptions due to the base class making calls to stuff not mocked
filterController = new FilterController(foo1mock.Object, foo2mock.Object, foo3mock.Object, foo4mock.Object);
}

[TestCleanup]
public void Cleanup(){}

[ExpectedException(typeof(CustomException))]
[TestMethod]
public void SomeMethod_ForcedErrorScenario_CatchesCustomException()
{
// Arrange
filterControllerMock
.Setup(x => x.SomeMethod(It.IsAny<string>(), It.IsAny<bool>()))
.Returns(new CustomException());

// Act
var result = filterController.SomeMethod("Foobar", false);
}

在这种情况下,有一个 Try Catch block ,我确保当它到达 catch block 以确认错误已修复时得到正确处理。我不在乎出于测试的目的如何抛出异常,只是它被捕获并执行我期望的操作。但是,就像我说的那样,由于它继承自 BaseController,我无法通过尝试模拟 FilterController 构造函数本身来调用其具体方法。

--
编辑 : 解决了问题。在 BaseController 中,_someOtherInterface 是根据构造函数中传递的接口(interface)之一实例化的。在我的 MSTest Initialize 方法中,我只需要使其接口(interface)不是空引用,然后使用 Setup(x=>x.otherMethod()).Returns(_someOtherInterface.Object) 覆盖它调用的方法。

最佳答案

发现我的问题......在 BaseController

// I didn't realize the _someOtherInterface was instantiated based off an interface passed in
_someOtherInterface = _IFoo1.AMethodNotMocked();
// many lines later...
_somePrivateProperty = _someOtherInterface.SomeMockedMethod()

为了解决这个问题,我必须在尝试创建 filterController = new FilterController(interfacemock.Object) 之前在 [TestInitialize] Initialize 方法中这样做,我必须重写 _IFoo1.AMethodNotMocked。像这样:
IFoo1.Setup(s => AMethodNotMocked()).Returns(new Foobar())

这使得当测试调用 FilterController 时,IFoo1 接口(interface)被填充,因此不会引发空引用错误。

关于c# - Moq:模拟具有多重继承的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38773597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com