Я пытался использовать поддержку тестового репозитория SubSonic 3.0 для модульного тестирования, но столкнулся с несколькими проблемами, поэтому я решил документировать их и исправления, которые придумали:
Столбцы с автоинкрементом не работают
Очевидно, что без БД столбцы с автоинкрементом не работают автоматически, но если, как и я, вы используете простые целые или длинные значения для всех столбцов идентификаторов, это исправление работает хорошо:
(Это копия с здесь , включена для полноты)
В ActiveRecord.tt:
1: в верхней части функции public void Add (поставщик IDataProvider) {
public void Add(IDataProvider provider){
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
if (TestMode)
{
this.<#=tbl.PK.CleanName#>=++next_test_autoid;
}
<#}#>
2: под строкой public bool TestMode = false добавьте:
public bool TestMode = false;
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
private static <#=tbl.PK.SysType#> next_test_autoid = 0;
<#}#>
Сравнение равенства объектов нарушено
При использовании шаблона ActiveRecord по умолчанию равенство объектов не работает. Таким образом, удаление элементов из БД не работает, поскольку List <>. Remove (), используемый в TestRepository, не соответствует удаляемому элементу. Это может быть исправлено в шаблонах tt следующим образом: (т. Е. Замена "==" на "Equals ()")
В ActiveRecord.tt:
public override bool Equals(object obj){
if(obj.GetType()==typeof(<#=tbl.ClassName#>)){
<#=tbl.ClassName#> compare=(<#=tbl.ClassName#>)obj;
return compare.KeyValue().Equals(this.KeyValue());
}else{
return base.Equals(obj);
}
}
DeleteMany не реализовано в репозитории тестов
Операции, подобные этой records.Delete(x => x.whatever == whatever)
, не выполняются в тестовом репо, поскольку DeleteMany не реализована Исправление требует получения исходного кода и сборки самостоятельно, но вот реализация, которая, кажется, работает:
В TestRepository.cs:
public int DeleteMany(Expression<Func<T, bool>> expression)
{
foreach (var x in _items.AsQueryable().Where(expression).ToList())
{
_items.Remove(x);
}
return 0;
}