XUnit结合Autofac.Extras.Moq单元测试报错问题求助
解决XUnit+AutoMock测试
FindFloorByName方法时的NotSupportedException问题 嘿,我看到你在给FloorManager写单元测试时踩了个小坑!先说说你为啥会遇到System.NotSupportedException:你错误地Mock了被测试的类本身(也就是FloorManager),还试图Setup你要测试的FindFloorByName方法。AutoMock底层依赖Moq,Moq没办法对非虚方法设置这样的表达式;而且更关键的是,单元测试的核心是验证真实类的逻辑,不该Mock你要测试的对象本身!
咱们来修正这个测试用例,步骤很清晰:
- 直接实例化真实的
FloorManager对象,不用AutoMock去Create它 - 给
FloorManager的Floors集合预先添加测试用的FloorInfo数据 - 调用要测试的
FindFloorByName方法,验证返回结果符合预期
修正后的测试代码如下:
[Fact] public void FindFloorByName_ShouldReturnMatchingFloor() { // 1. 实例化真实的被测试对象 var floorManager = new FloorManager(); string targetFloorName = "First Floor"; // 2. 准备测试数据:给FloorManager添加已知的FloorInfo var testFloor = new FloorInfo { Name = targetFloorName }; floorManager.Floors.Add(testFloor); // 3. 调用要测试的方法 var result = floorManager.FindFloorByName(targetFloorName); // 4. 断言结果正确 Assert.NotNull(result); Assert.Equal(targetFloorName, result.Name); }
为啥这么改?
- 我们要测试的是
FloorManager中FindFloorByName的真实逻辑——也就是它能不能从自己的Floors列表里找到匹配名称的FloorInfo,所以必须用真实的FloorManager实例,而不是Mock对象。 - 原来的测试用Mock去Setup
FindFloorByName,相当于你自己模拟了这个方法的返回值,根本没测试到真实的业务逻辑,这样的测试其实毫无意义。
如果后续你的FloorManager需要依赖其他服务(比如依赖数据仓库获取楼层信息),那时候才需要用AutoMock去Mock那些依赖项,而不是MockFloorManager本身。
内容的提问来源于stack exchange,提问作者Omkar
相关产品推荐
相关产品推荐

