Как установить параметр generi c в настройке moq? - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь настроить макет интерфейса с общей функцией c, используя MOQ. эта функция имеет следующие обозначения:

public interface IWizard
{
    bool Cast<TSpell>(TSpell spell)
        where TSpell : SpellBase, IComponents;
}

Когда я пытаюсь установить функцию настройки, я не могу просто завершить ее sh. Я продолжаю получать сообщение о том, что неявное преобразование невозможно. Он содержит следующий текст: «Не существует неявного преобразования ссылок из« SpellBase »в« IComponents ».

var wizard = new Mock<IWizard>();
wizard
    .Setup(x => x.Cast(It.IsAny<SpellBase>())) // this line has an error
    .Returns(true);

Какие у меня есть варианты, кроме реализации базового класса, который реализует как SpellBase, так и IComponents? Возможно ли это вообще?

EDIT1: я пытался реализовать подход Петра следующим образом:

    [Test]
    public void Test_JsonConvert_Performace()
    {
        var wizard = new Mock<IWizard>();
        wizard
            .Setup(x => x.Cast(It.IsAny<TestSpell>()))
            .Returns(true);


        var result = wizard.Object.Cast(new RealSpell());

        Assert.IsTrue(result);

    }


    public interface IWizard
    {
        bool Cast<TSpell>(TSpell spell)
            where TSpell : SpellBase, IComponents;
    }


    public abstract class SpellBase
    {
    }

    public interface IComponents
    {
    }

    public class TestSpell : SpellBase, IComponents
    {
    }

    public class RealSpell : SpellBase, IComponents
    {
    }

к сожалению, мой тест не пройден.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Вы можете создать свой макет в общем методе c:

[TestMethod]
void Test()
{
    var wizard = MockObject<TestSpell>();
}

private Mock<IWizard> MockObject<T>() where T : SpellBase, IComponents
{
    var mock = new Mock<IWizard>();
    mock.Setup(pa => pa.Cast(It.IsAny<T>()))
        .Returns(true);
    return mock;
}

private class TestSpell : SpellBase, IComponents
{ }

TestSpell класс требуется только в вашем тестовом проекте

0 голосов
/ 28 февраля 2020

Fist Option: необходимо удалить IComponent из IWizard.Cast ограничений

public interface IWizard
{
    bool Cast<TSpell>(TSpell spell) where TSpell : SpellBase, IComponents;//wont compile

    bool Cast<TSpell>(TSpell spell) where TSpell : SpellBase; //will compile
}

Второй вариант: создать класс, который наследует SpellBase и реализует IComponents

public class ComponetsSpellBase:SpellBase, IComponents
{
    //IComponents Implementation
}


wizard.Setup(x => x.Cast(It.IsAny<ComponetsSpellBase>())).Returns(false);

public class FireSpell:ComponentSpellBase{}
...