2015-10-20 4 views
0

Я не могу найти правильный сценарий для того, что я пытаюсь сделать, несмотря на значительную работу с Google. Я новичок в тестировании/модульном тестировании/tdd и т. Д.Тестирование с помощью генералов

У меня есть следующий класс;

public class AssetManager 
{ 
    public DisconnectedBindingList<Change, AssetContext> ChangeList {get; private set;} 

    public AssetManager() 
    { 
     ChangeList = new DisconnectedBindingList<Change, AssetContext>(); 
    } 

    public bool IsChangeValid(Change newChange) 
    { 
     return ChangeList.Any(c => c.idChange == newChange.idChange); 
    } 
} 

Чтобы сделать его более удобным для тестирования, я изменил интерфейс;

public interface IAssetManager<TContext> where TContext : DbContext, new() 
{ 
    DisconnectedBindingList<Change, TContext> ChangeList {get; set;} 

    bool IsChangeValid(Change newChange); 
} 

public class AssetManager<TContext> : IAssetManager<TContext> where TContext : DbContext, new() 
{ ... } 

Очевидно, есть некоторые DisconnectedBindingList<T,TContext>, по существу, локальный кэш. TContext необходим только при инициализации/обновлении, поэтому он не передается/сохраняется в DisconnectedBindingList.

Это все равно не помогает мне в тестировании.

У меня есть моя тестовая установка следующим образом;

DisconnectedBindingList<Change, TestContext> data = ... 
Mock<IAssetManager<TestContext>> mockRepo = new Mock<IAssetManager<TestContext>>(); 
mockRepo.SetupGet(x => x.ChangeList).Returns(data); 
Assert.IsTrue(mockRepo.Object.IsChangeValid(new Change{idChange = 2})); 

Адрес: TestContext is just;

public class TestContext : DbContext {} 

Я просто не совсем уверен, где все это падает. Кажется, что метод AssetManager.IsChangeValid() не вызывается, что имеет смысл, поскольку я не инициализирую AssetManager, а только IAssetManager. Я потерялся относительно того, как реорганизовать/реорганизовать код, чтобы получить эту работу.

ответ

0

Вы тестируете AssetManager, так что это, вероятно, не очень хорошая идея, чтобы издеваться над этим. Вы хотите издеваться над вещами, которые AssetManager зависит от, а не самого AssetManager.

Написать свой тест, как это:

DisconnectedBindingList<Change, TestContext> data = ... 
var am = new AssetManager(); 
am.ChangeList = data; 
Assert.IsTrue(am.IsChangeValid(new Change{idChange = 2})); 

Если AssetManager зависит от чего-то (скажем, к примеру, он считывает из базы данных), вы хотите, чтобы дразнить что компонент из этого теста.

+0

Да, ChangeList - это частный набор, поэтому, хотя я понимаю, что вы получаете, в этом случае он не работает. – Trent

+0

@FizzBuzz В этом случае вам нужно изменить способ захвата данных. Либо разрешите его как аргумент конструктора, либо вычеркните компонент, который дает вам данные. (Например, если «ChangeList» поступает из базы данных, извините службу базы данных и вместо этого верните «данные») – Rob

+0

В качестве альтернативы вы могли бы потенциально вызвать '.ChangeList.Clear();' и 'ChangeList.AddRange (data); ', предполагая, что коллекция позволяет это (я не знаком с' DisconnectedBindingList <,> ') – Rob

Смежные вопросы