Включите свойство с [Key] в насмешку абстрактного класса

Я пытаюсь имитировать (Moq lib) абстрактный класс (в этом примере X-класс). Внутри этого класса это свойство, которому присвоено значение [ForeignKey("xId")]. Классы следующие, и я пытаюсь издеваться над этим классом X.

Но я получаю ошибку

"System.NotSupportedException: 'Недопустимая установка на невиртуальном (переопределяемом в VB) члене: mock => mock.SubX'"

.

Кто-нибудь знает, как лучше всего издеваться над такой собственностью?

public abstract class X
{
   [ForeignKey("xId")]
   public SubX SubX {get; set;}
}

public class SubX
{
   [Key]
   public int Id {get; set;}
}

var mockedX = Mock.Of<X>(a => a.SubX.Id == 10);

person ShrnPrmshr    schedule 22.01.2019    source источник
comment
XY проблема. Почему вы вообще пытаетесь издеваться над этим классом? Если вы исследуете это сообщение об ошибке, возникнет множество связанных вопросов, что вы пробовали?   -  person CodeCaster    schedule 22.01.2019
comment
У меня есть класс, который использует этот класс как возвращаемое значение для репо. и мне нужно издеваться над этим репо и использовать этот класс в качестве возвращаемого значения. _mockedXRepository.Setup (f = ›f.GetX (It.IsAny‹ int ())). Returns (mockedX);   -  person ShrnPrmshr    schedule 22.01.2019
comment
Вы не должны издеваться над классом, и если вы настаиваете на этом, вы должны пометить свойство как virtual, как предполагает исключение. Вместо этого вам следует смоделировать интерфейс, который содержит член контракта, который возвращает производный тип X, чтобы он возвращал экземпляр производного X., Содержащий ваши тестовые данные.   -  person ColinM    schedule 22.01.2019
comment
Вы не издеваетесь над возвращаемыми значениями, вы издеваетесь над зависимостями. Вы можете просто вернуть new DerivedFromX { SubX = new SubX { Id = 10 } } из этого фиктивного вызова.   -  person CodeCaster    schedule 22.01.2019
comment
@ColinM Это устаревший код, и я стараюсь его вообще не трогать.   -  person ShrnPrmshr    schedule 22.01.2019
comment
Реализует ли реализация, возвращающая X или SubX, интерфейс или фиктивную зависимость?   -  person ColinM    schedule 22.01.2019
comment
@CodeCaster, Да, я это сделал, но мне больше было интересно, как я могу издеваться над этим абстрактным классом и почему я не могу ничего назначить этому конкретному свойству. Потому что я легко могу назначить других. поэтому я пытаюсь понять причины этого, чтобы решить мою проблему.   -  person ShrnPrmshr    schedule 22.01.2019
comment
Чтобы ответить на этот вопрос: stackoverflow.com/a/21793891/5062791   -  person ColinM    schedule 22.01.2019
comment
@ColinM, совсем нет. Написано плохо. Нет интерфейса. Мне нужно издеваться над каждой вещью или наихудшим сценарием создать новые классы для использования этих абстрактных классов.   -  person ShrnPrmshr    schedule 22.01.2019
comment
Рассматривая устаревший сценарий, здесь стоит прочитать, поскольку шаблоны - это обычное дело при рефакторинге, поскольку вы не должны просто изменять свойства на virtual ради теста pdfs.semanticscholar.org/1aa8/   -  person ColinM    schedule 22.01.2019


Ответы (1)


Используйте неабстрактный класс, унаследованный от X:

class XMock : X
{
}

var mockedX = new XMock(); 
person Elton Garcia de Santana    schedule 22.01.2019
comment
Здорово! не могли бы вы отметить ответ как правильный? - person Elton Garcia de Santana; 23.01.2019