2015-09-21 2 views
0

Я хочу спросить, что является хорошим модульным тестом для метода ниже GetMeetingsByInterimIdentifier, где промежуточный идентификатор представляет собой строку - например, 78th2015.Как тестировать устройство без попадания в базу данных

Мы настроены на использование интерфейса IMeetingsService. Мы используем MOQ и Microsoft.VisualStudio.TestTools.UnitTesting.

public class MeetingsService : IMeetingsService 
{ 
    private readonly IInterimCommitteeDbContext _db; 

    public MeetingsService(IInterimCommitteeDbContext db) 
    { 
     this._db = db; 
    } 

    public IQueryable<Meeting> GetMeetingsByInterimIdentifier(string interimIdentifier) 
    { 
     return 
      from m in this._db.Meetings 
      join c in this._db.Committees on m.CommitteeId equals c.CommitteeId 
      where c.InterimIdentifier == interimIdentifier 
      select m; 
    } 

    public Meeting GetMeeting(int meetingKey) 
    { 
     return this._db.Meetings.FirstOrDefault(x => x.MeetingId == meetingKey); 

    } 

} 

Edit:

Но я не знаю, как установить его. Этот результат не является нулевым, но что он делает для меня?

[TestMethod] 
public void GetMeetingsByInterimIdentifier_WithInterimIdentifier_ReturnsMeetingList() 
{ 
    //Arrange 
    var interim = Properties.Settings.Default.DefaultInterimIdentifier; 
    var result = _meetingServiceMock.Setup(x => x.GetMeetingsByInterimIdentifier(interim)); 

    //Act 

    //Assert 
    Assert.IsNotNull(result); 
} 
+0

я, вероятно, не будет беспокоить модульного тестирования этого. Вы тестируете, что объекты базы данных возвращаются из EF на основе фильтра ('interimIdentifier'). Ваш код не обрабатывает результат после выполнения оператора LINQ, поэтому вам лучше создать тест интеграции, который фактически попадает в базу данных. – levelnis

ответ

0

Используйте Mocking, вот для чего. Используйте JMock или Mockito или любую другую библиотеку, которую вы предпочитаете.

+0

Это не ответ, более того; вы предлагаете OP безрецептурные рамки, так как он использует 'C#', а не' Java', а в одиночной строке SO это не ответ ... –

0

Создайте Mock<IInterimCommitteeDbContext> и передайте его в конструктор. На этом объекте настройте свойства и Committees для возврата различных коллекций.

У вас должны быть разные настройки тестов, которые возвращают разные коллекции. Например, как это должно вести себя, если оба значения Meetings и Committees пусты, то есть нет данных в базе данных? Как он должен себя вести, если нет объекта с предоставленным InterimIdentifier? Как насчет того, есть ли та, которая соответствует и т. Д.

+0

Но я не уверен, как его настроить. Это не работает: – kfwbird

+0

Возможно, добавьте то, что у вас есть до сих пор, или создайте новый вопрос с тем, что у вас есть? – TomDoesCode

+0

Но я не уверен, как настроить его. Этот результат не является нулевым, но что он делает для меня? [TestMethod] общественных недействительный GetMeetingsByInterimIdentifier_WithInterimIdentifier_ReturnsMeetingList() {// организовать уаг промежуточного = Properties.Settings.Default.DefaultInterimIdentifier; var result = _meetingServiceMock.Setup (x => x.GetMeetingsByInterimIdentifier (промежуточный)); // Закон // Утверждение Assert.IsNotNull (результат); } – kfwbird

0

Я понял, как это сделать, используя тестовые двойники. Я использую Entity Framework 6 с первой моделью кода. Я создал DbContext, унаследованный от моего интерфейса I-DbContext. Затем мне удалось создать данные в памяти для использования в модульных тестах уровня сервиса. Ниже приведен пример:

  1. контекст тестовых данных,
  2. тест dbset,
  3. теста, например, единицы.

Это решение было доступно из статьи MSDN здесь: https://msdn.microsoft.com/en-us/data/dn314429.aspx ...

 
     public class CommitteeContextTest : ICommitteeDbContext 
     { 
      public CommitteeContextTest() 
      { 
       this.Committees = new TestDbSet(); 
       this.CommitteeMembers = new TestDbSet(); 
      } 
      public Database Database { get; } 
      public DbSet Committees { get; set; } 
      public DbSet CommitteeMembers { get; set; } 
     } 
    } 

 
public class TestDbSet : DbSet, IQueryable, IEnumerable, IDbAsyncEnumerable 
      where TEntity : class 
    { 
     ObservableCollection _data; 
     IQueryable _query; 

     public TestDbSet() 
     { 
      _data = new ObservableCollection(); 
      _query = _data.AsQueryable(); 
     } 

     public override TEntity Add(TEntity item) 
     { 
      _data.Add(item); 
      return item; 
     } 

     public override TEntity Remove(TEntity item) 
     { 
      _data.Remove(item); 
      return item; 
     } 

     public override TEntity Attach(TEntity item) 
     { 
      _data.Add(item); 
      return item; 
     } 

     public override TEntity Create() 
     { 
      return Activator.CreateInstance(); 
     } 
    } 

    [TestClass] 
    public class CommitteeServiceTest 
    { 
     private InterimCommitteeContextTest _interimCommitteeContext; 
     private ICommitteeService _service; 
     private string _interim; 

     [TestInitialize] 
     public void SetUp() 
     { 
      _interimCommitteeContext = new InterimCommitteeContextTest(); 
      _service = new CommitteeService(_interimCommitteeContext); 
      _interim = Settings.Default.DefaultInterimIdentifier; 
     } 

     [TestCleanup] 
     public void Teardown() 
     { 
      _interimCommitteeContext = null; 
      _service = null; 
     } 

     [TestMethod] 
     public void GetCommittee_ProvideInterimCommitteeId_ReturnOneCommittee() 
     { 
      //Arrange 
      AddCommittees(); 

      //Act and Assert 
      var result = _service.GetCommittee(_interim, 1); 
      Assert.AreEqual(1, result.CommitteeId); //Passes. IsActive set to true; 
      result = _service.GetCommittee(_interim, 0); 
      Assert.IsNull(result); //Fails. No committeeId = 0; 
      result = _service.GetCommittee(_interim, 2); 
      Assert.IsNull(result); //Fails. CommitteeId = 2 is not active. 
     } 

     [TestMethod] 
     public void AddCommittees() 
     { 
      _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 1, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1 }); 
      _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 2, InterimIdentifier = _interim, IsActive = false, CommitteeTypeId = 1 }); 
      _interimCommitteeContext.Committees.Add(new Committee() { CommitteeId = 3, InterimIdentifier = _interim, IsActive = true, CommitteeTypeId = 1 }); 
     } 
    } 
Смежные вопросы