2016-07-03 3 views
0

Я рекомендую проблему при написании модульных тестов, которые проверяют, возвращает ли функция действительные результаты при соединении двух таблиц. У меня есть следующий сценарий: У меня есть 2 таблицы, называемые их папкой и элементом, папка может содержать несколько элементов. Их DDL выглядит следующим образом:Единичный тест не возвращает результат для объединенных таблиц

create table Folder 
( varchar(max) Name, 
    int User_Id, 
    int Id primary key 
); 
create table Item 
( int Id primary key, 
    varchar(max) Data, 
    int User_Id, 
    int Folder_id foreign key Folder(Id) 
} 

И я хочу, чтобы собрать все «данные» из элементов, которые принадлежат к папкам, названия которых начинаются с некоторым префиксом. Поэтому я пишу следующую функцию, которая отлично работает и возвращает действительные результаты.

string GetDatas(string prefix, int userId) //_db is injected, this function is a part of a DatasProvider class 
{ 
    dynamic folder; 
    return _db.dbo.Item.FindAllByUser_Id(userId) 
      .Join(_db.dbo.Folder, out folder) 
      .On(_db.dbo.Item.Folder_id == folder.Id) 
      .Where(_db.dbo.Folder.Name.Like(prefix)) 
      .Select(_db.dbo.Item.Data) 
      .ToScalarList<string>(); 
} 

И я пишу юнит тест, чтобы проверить, если функция работает отлично, моя спецификация выглядит следующим образом:

public class Spec 
{ 
    private static dynamic _db; 
    private static IList<string> result; 
    private const int userId = 14; 
    private const string validPrefix = "dd"; 
    private const int validFolderId = 22; 
    private const int invalidFolderId = 33; 

    private static readonly List<string> validData = new List<string>() 
    { 
     "1", 
     "2", 
     "3", 
     "4" 
    }; 

    private static readonly List<string> invalidData = new List<string>() 
    { 
     "a", 
     "b", 
     "z" 
    }; 

    public class When_getting_data : Observes<DatasProvider> 
    { 
     public Establish context =() => 
     { 
      Database.UseMockAdapter(new InMemoryAdapter()); 
      _db = Database.Open(); 
      _db.dbo.Folder.Insert(Id: validFolderId, User_Id: userId, Name: validPrefix + "4231142"); 
      _db.dbo.Folder.Insert(Id: invalidFolderId, User_Id: userId, Name: "4321" + validPrefix + "4231142"); 

      for (int i = 0; i < validData.Count; ++i) 
      { 
       _db.dbo.Item.Insert(Id: i, User_Id: userId, Folder_Id: validFolderId, Data: validData[i]); 
      } 
      for (int i = 0; i < invalidData.Count; ++i) 
      { 
       _db.dbo.Item.Insert(Id: i + validData.Count, User_Id: userId, Folder_Id: invalidFolderId, Data: invalidData[i]); 
      } 
      depends.on<dynamic>(_db); 
     }; 

     private Because of =() => result = sut.GetDatas(userId, validPrefix); 
     private It should_return_valid_datas_count =() => result.Count.ShouldEqual(validData.Count); 

     private It should_return_valid_datas =() => result.ShouldContainOnly(validData); 
     private It should_not_return_invalid_datas =() => result.ShouldNotContain(invalidData); 
    } 
} 

Но данные failes потому, что функции GetDatas возвращает 0 результатов. Когда я дебютирую код, я узнаю, что он находит все элементы для пользователя, но когда я хочу получить все имена папок, связанные с этими элементами, принадлежащими пользователю, я получаю список с допустимым числом результатов, но с нулевыми значениями внутри для каждого результата. Есть ли что-то, что я должен сделать, чтобы сделать тесты такими, как должно?

Редактировать

Я также пытаюсь указать мастер/подробно в дб адаптер, но он ничего не делает ..

var adapter = new InMemoryAdapter(); 
adapter.Join.Master("Folder", "Id").Detail("Item", "Folder_Id"); 
Database.UseMockAdapter(adapter); 

ответ

0

исправить мою проблему, изменив часть кода для сбора данных в этот :

dynamic folder; 
return _db.Item.FindAllByUser_Id(userId) 
    .Join(_db.Folder, out folder) 
    .On(_db.Item.Folder_Id == folder.Id) 
    .With(folder) 
    .Where(folder.Name.Like(prefix)) 
    .Select(_db.Item.Data) 
    .ToScalarList<string>(); 

и через адаптер задав с отношения в тесте

var adapter = new InMemoryAdapter(); 
adapter.Join.Master("Folder", "Id").Detail("Item", "Folder_Id"); 
Database.UseMockAdapter(adapter); 
_db = Database.Open(); 
Смежные вопросы