Вы пытаетесь смоделировать модуль Players
, а не класс Players
. Попробуйте это:
@patch.object(myproject.entities.Players.Players, 'add_player', fake_add_player)
Некоторые несвязанные, незапрошенные советы:
Players.py
, содержащий класс Player
. Я ожидаю, что этот класс будет жить в модуле entities
(myproject/entities.py
вместо myproject/entities/Players.py
). ваш fake_add_players
сломан. Должно быть:
def fake_add_player(self, player):
self.players.append(player)
После патча Игроки, self
относится к Players
, а не PlayersTest
. Вы можете удалить функцию из класса, чтобы избежать этой путаницы.
Players
также может быть пользовательским менеджером . Можно обратиться к этому в типе возврата ProvideDefaultSorting. Этот код не создает:
public IOrderedQueryable<int> GetOrderedQueryable()
{
IQueryable<int> myInts = new List<int>() { 3, 4, 1, 2 }.AsQueryable<int>();
return myInts.Where(i => i == 2);
}
Этот код сборки, но коварно и кодер, получает то, чего они заслуживают.
public IOrderedQueryable<int> GetOrderedQueryable()
{
IQueryable<int> myInts = new List<int>() { 3, 4, 1, 2 }.AsQueryable<int>();
return myInts.Where(i => i == 2) as IOrderedQueryable<int>;
}
Та же история с касательно (это не создает):
public void GetOrderedQueryable(ref IOrderedQueryable<int> query)
{
query = query.Where(i => i == 2);
}
Подкачка страниц зависит от Упорядочивания сильным способом. Почему бы не сильно связывать операции? Вот один способ сделать это:
Объекты поддержки
public interface IOrderByExpression<T>
{
ApplyOrdering(ref IQueryable<T> query);
}
public class OrderByExpression<T, U> : IOrderByExpression<T>
{
public IQueryable<T> ApplyOrderBy(ref IQueryable<T> query)
{
query = query.OrderBy(exp);
}
//TODO OrderByDescending, ThenBy, ThenByDescending methods.
private Expression<Func<T, U>> exp = null;
//TODO bool descending?
public OrderByExpression (Expression<Func<T, U>> myExpression)
{
exp = myExpression;
}
}
Рассматриваемый метод:
public IQueryable<Category> List(int startIndex, int count, IOrderByExpression<Category> ordering)
{
NorthwindEntities ent = new NorthwindEntities();
IQueryable<Category> query = ent.Categories;
if (ordering == null)
{
ordering = new OrderByExpression<Category, int>(c => c.CategoryID)
}
ordering.ApplyOrdering(ref query);
return query.Skip(startIndex).Take(count);
}
Некоторое время спустя, вызов метода:
var query = List(20, 20, new OrderByExpression<Category, string>(c => c.CategoryName));
Благодаря David B у меня есть следующее решение. (Я должен был добавить обнаружение для ситуации, где частичный метод не выполнялся или просто возвратился, это - параметр).
public partial class Repository
{
partial void ProvideDefaultSorting(ref IOrderedQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
NorthwindEntities ent = new NorthwindEntities();
IOrderedQueryable<Category> query = ent.CategorySet;
var oldQuery = query;
ProvideDefaultSorting(ref query);
if (oldQuery.Equals(query)) // the partial method did nothing with the query, or just didn't exist
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
// the rest..
}
public partial class Repository
{
partial void ProvideDefaultSorting(ref IOrderedQueryable<Category> currentQuery)
{
currentQuery = currentQuery.Where(c => c.CategoryName.Contains(" ")).OrderBy(c => c.CategoryName); // compile time forced sotring
}
}
Это гарантирует во время компиляции, чтобы, если частичный метод реализован, это, по крайней мере, сохранило это IOrderdQueryable.
И когда частичный метод не реализован или просто возвращает свой параметр, запрос не будет изменен, и это будет использовать вид нейтрализации.
Я боюсь, что это немного более твердо, чем это. Вы видите, Платформа Объекта будет, при определенных обстоятельствах, тихо игнорировать OrderBy. Таким образом, не достаточно просто искать OrderBy в дереве выражений. OrderBy должен быть в "правильном" месте, и определением "правильного" места является деталь реализации Платформы Объекта.
Как Вы, возможно, предположили к настоящему времени, я нахожусь в том же месте, как Вы; я использую шаблон репозитория объекта и делаю Брать/Пропущение на уровне представления. Решение, которое я использовал, который, возможно, не идеален, но достаточно хорош для того, что я делаю, не состоит в том, чтобы сделать никакого упорядочивания до прошлого момента, чтобы гарантировать, что OrderBy всегда является последней вещью в дерево выражений. Таким образом, любое действие, которое собирается сделать Брать/Пропущение (прямо или косвенно), вводит OrderBy сначала. Код структурирован таким образом, что это может только произойти однажды.
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
Изменение в:
//apply a default ordering
query = query.OrderBy(c => c.CategoryID);
//add to the ordering
ProvideDefaultSorting(ref query);
Это не идеальное решение.
Это не решает, "просачиваются проблема" функции упорядочивания, которую Вы заявили. Это действительно решает, "Я забыл реализовывать упорядочивание" или "Я принимаю решение не заказать".
Я протестировал это решение в LinqToSql:
public void OrderManyTimes()
{
DataClasses1DataContext myDC = new DataClasses1DataContext();
var query = myDC.Customers.OrderBy(c => c.Field3);
query = query.OrderBy(c => c.Field2);
query = query.OrderBy(c => c.Field1);
Console.WriteLine(myDC.GetCommand(query).CommandText);
}
Генерирует (отметьте обратный порядок упорядочиваний):
SELECT Field1, Field2, Field3
FROM [dbo].[Customers] AS [t0]
ORDER BY [t0].[Field1], [t0].[Field2], [t0].[Field3]