尝试使用MockedClass.Setup(x => x.Method())模拟接口时,我遇到了这个奇怪的问题。
这是我正在嘲笑的界面。
public interface IClassFactory
{
object GetValueFromFormData(string key, MultipartFormDataStreamProvider provider);
}
这是我的考验。
[TestMethod]
[ExpectedException(typeof(NullReferenceException))]
public async Task ClassApiController_ImportClassList_ThrowsNullReferenceExceptionWhenNoClassId()
{
// Arrange
_classFactory = new Mock<IClassFactory>();
// THIS IS THE LINE THAT GIVES AN EXCEPTION
_classFactory.Setup(x => x.GetValueFromFormData("classIdNull", null)).Returns(string.Empty);
ClassApiController controller = new ClassApiController(_classRepository.Object, _surveyRepository.Object, _classFactory.Object);
// Act
string result = await controller.ImportClassList();
}
如果你看一下我的评论“这就是提供异常的界限”,你会发现我发送了null,但是如果我将MultipartFormDataStreamProvider
作为一个实例化的课程发送而无所谓,我仍然得到同样的例外。
Exception message: System.ArgumentException: Expression of type 'System.Net.Http.MultipartFormDataStreamProvider' cannot be used for parameter of type 'System.Net.Http.MultipartFormDataStreamProvider' of method 'System.Object GetValueFromFormData(System.String, System.Net.Http.MultipartFormDataStreamProvider)'
如果你知道为什么我不能仅仅因为它有这个对象作为参数来模拟方法,请帮助我,我很无能为力。
谢谢!
编辑: 请参阅我的答案中的解决方案
答案 0 :(得分:1)
你应该试试
_classFactory = Mock.Of<IClassFactory>();
Mock.Get(_classFactory).Setup(x => x.GetValueFromFormData("classIdNull", It.IsAny<MultipartStreamProvider>()))
.Returns(string.Empty);
答案 1 :(得分:1)
在@ Vignesh.N的帮助下,我终于解决了它。在这种情况下,简单的答案是我的解决方案分为几个项目。 Web,测试,数据等。在Web项目中,我通过Nuget引用了web api .dll:s,在测试项目中,我直接通过Add references -> Assemblies -> Framework
引用了它们。因此.dll:s具有相同的版本但不具有文件版本。在让Nuget处理所有项目的web api .dll文件后,它立即工作。
总而言之,这是一个愚蠢的错误,很难发现。