Почему метод не проходит тест?

224
17 сентября 2018, 18:10

Есть такой вот класс и тест не проходит только метод сохранения

public class BaseServices<T> : IBaseService<T> where T : BaseEntity, new()
{
    public List<T> AllItem = new List<T>();
    public bool Delete(int id) 
    {
        bool b = false;
        for (int i = AllItem.Count - 1; i >= 0; i--)
        {
            if (AllItem[i].Id == id)
            {
                AllItem.Remove(AllItem[i]);
                b = true;
                return b;
            }
        }
        return b;
    }
    public T Get(int id)
    {
        T b = null;
        foreach (var a in AllItem)
        {
            if (a.Id == id)
            {
                b = a;
                return b;
            }
        }
        return b;
    }
    public object GetAll() 
    {
        object b = null;
        foreach (var a in AllItem)
        {
            b = a;
            return b;
        }
        return b;
    }
    public bool Save(T entity)
    {
        entity = new T();
        AllItem.Add(entity);
        return true;
    }
}

И есть вот такой тест

List<AccountModel> Accounts = new List<AccountModel>();
    private BaseServices<AccountModel> AccountBS = new BaseServices<AccountModel>();
    Random rnd = new Random();
    private int SomeId;
    private int AccountsLenth;
    [TestInitialize]
    public void Repletion()
    {
        SomeId = rnd.Next(100);
        for (int index = 0; index < 100; ++index)
        {
            AccountBS.AllItem.Add(new AccountModel { Id = index });
        }
        AccountsLenth = Accounts.Count;
    }
    [TestMethod]
    public void GetTest()
    {
        AccountModel result = AccountBS.Get(SomeId);
        Assert.IsNotNull(result);
    }
    [TestMethod]
    public void DeleteBoolTest()
    {
        bool result = AccountBS.Delete(SomeId);
        Assert.IsTrue(result);
    }
    [TestMethod]
    public void SaveBoolTest()
    {
        var ent = new AccountModel();
        bool result = AccountBS.Save(ent);
        Assert.IsTrue(result);
    }
    [TestMethod]
    public void SaveCountTest()
    {
        var ent = new AccountModel();
        AccountBS.Save(ent);
        int AccountsLenth1 = Accounts.Count;
        Assert.AreNotEqual(AccountsLenth, this.Accounts.Count);
    }
}

Вот тест метода SaveCountTest не проходит, говорит, что у меня списки пустые

Answer 1

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

List<AccountModel> Accounts = new List<AccountModel>();

но вы так ни разу туда ничего и не положили - это просто переменная. Все данные, которые у вас есть, хранятся вот тут:

private BaseServices<AccountModel> AccountBS = new BaseServices<AccountModel>();

А если быть более точным, то внутри, в AllItem. Первое, что нужно переписать:

[TestInitialize]
public void Repletion()
{
    SomeId = rnd.Next(100);
    for (int index = 0; index < 100; ++index)
    {
        AccountBS.AllItem.Add(new AccountModel { Id = index });
    }
    // уберем количество элементов коллекции отсюда
    // так как в процессе выполнения тестов оно меняется
}

Затем сам метод теста переписать следующим образом:

[TestMethod]
public void SaveCountTest()
{
    var ent = new AccountModel();
    // присвоим значение в переменную (сколько было до добавления)
    var oldAccountsLenth = AccountBS.AllItem.Count; 
    AccountBS.Save(ent);
    // сравним старое присвоенное значение и новую длину списка
    Assert.AreNotEqual(oldAccountsLenth, AccountBS.AllItem.Count);
}

А вот переменную, которая несет не особо много смысловой нагрузки, нужно удалить, я говорю про:

List<AccountModel> Accounts = new List<AccountModel>();
READ ALSO
Как убить вечный цикл в DataContext?

Как убить вечный цикл в DataContext?

Есть класс-обертка над HttpListenerЗапускает listener сразу из конструктора

185
Как создать форму с отдельным потоком для обработки виндоус сообщений?

Как создать форму с отдельным потоком для обработки виндоус сообщений?

Для программы создаётся расширение наNET с использованием WinForms

200
Как правильно упаковывать ImageTarget(Vuforia) в AssetBundle?

Как правильно упаковывать ImageTarget(Vuforia) в AssetBundle?

Во время работы, программа должна принимать AssetBundleAssetBundle должен содержать ImageTarget и контент, относящийся к нему

219
LINQ из выражения в точечную нотацию

LINQ из выражения в точечную нотацию

Есть классы моделей

158