最小起订量-无法模拟类-无法隐式转换类型

时间:2018-10-01 02:13:10

标签: .net unit-testing moq

我有一个实现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>();

3 个答案:

答案 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中也遇到了这个问题。