我有一个实现IQueryResult并生成DTO的公共类。它具有一个公共name
字段。我创建它只是为了弄清楚发生了什么。看起来很简单,但我不断收到下面的错误。知道发生了什么吗?
ProjectsControllerTests.cs(40, 21): [CS0029]
Unit\ProjectsControllerTests.cs(40,21): error CS0029:
Cannot implicitly convert type 'Moq.Mock<...Queries.Results.Woot>'
to '....Queries.Results.Woot'
// Class Woot
public class Woot : IQueryResult
{
public Woot(string name)
{
Name = name;
}
public string Name { get; }
}
//在测试类中声明
private static Woot _woot;
//在SetupClass中模拟
_woot = new Mock<Woot>();
答案 0 :(得分:1)
该错误表明您正在尝试将Mock<Woot>
分配给Woot
变量。
这听起来像XY problem,但是如果您想要模拟对象,则可以调用Mock<T>.Object
属性
var mock = new Mock<Woot>();
_woot = mock.Object;
或使用Mock.Of<T>()
_woot = Mock.Of<Woot>();
参考Moq Quickstart,以更好地了解如何使用该框架。
答案 1 :(得分:0)
我相信您是根据具体实现而不是接口创建模拟的。模拟适用于“模拟”具体对象。
改为尝试Mock<IQueryResult
示例:How can I use Mock Objects in my unit tests and still use Code Coverage?
答案 2 :(得分:0)
尝试从项目中删除带有测试的文件,并使用git和IDK进行还原,为什么这样做有帮助,但是在将逻辑移至另一个接口之后,也许在某些地方缓存了一些东西,但我在VS中也遇到了这个问题。