ArrayLists используют массивы для хранения данных. Когда количество элементов превышает выделенный массив, он копирует данные в другой массив, возможно, в два раза больше.
При копировании массива (незначительное) снижение производительности происходит, поэтому можно установить размер внутреннего массива в конструкторе списка массивов.
Кроме того, он реализует java.util.Collection
и и java.util.list
, и поэтому возможно получить элемент по указанному индексу, и итеративный (как массив).
Не могли бы вы внедрить экземпляр MembershipProvider
в свой провайдер профиля и, если он не введен, вернуться к использованию Membership.Provider
?
public MembershipProvider MembershipProvider
{
get { return _membershipProvider ?? Membership.Provider; }
set { _membershipProvider = value; }
}
Ваш поставщик профиля будет взаимодействовать с поставщиком членства через значение, возвращаемое этим свойством. В свой тест вы должны внедрить экземпляр fake / mock MembershipProvider
.
Если вместо этого вы хотите просто имитировать статические методы в членстве, вам придется использовать что-то вроде TypeMock ], Наверное.
В ASP.NET MVC эта проблема решена путем инкапсуляции (упаковки) функций членства в MebershipService. Которые (например, с помощью инъекции) вы можете затем легко смоделировать в своих тестах.
Пример имитирующих служб ... http://www.asp.net/learn/mvc/tutorial-30-cs .aspx они не используют инъекцию
Хорошим примером является фактически тестовый проект, созданный при создании приложения ASP.NET. В следующем коде вы можете увидеть, как они имитируют объекты FormsAuthentication и Membership:
[TestMethod]
public void ConstructorSetsProperties()
{
// Arrange
IFormsAuthentication formsAuth = new MockFormsAuthenticationService();
IMembershipService membershipService = new AccountMembershipService();
// Act
AccountController controller = new AccountController(formsAuth, membershipService);
// Assert
Assert.AreEqual(formsAuth, controller.FormsAuth, "FormsAuth property did not match.");
Assert.AreEqual(membershipService, controller.MembershipService, "MembershipService property did not match.");
}
Я тоже сталкиваюсь с этой проблемой
, проблема заключается в том, что метод GetUser () без параметров реализован как статический метод в классе.
Принимая во внимание, что Membership.Provider (когда насмехается) не содержит метода GetUser () без параметров.
Кстати, вот как я исправил эту проблему. Я инкапсулировал статический вызов в своем собственном классе, который реализует интерфейс, чтобы его можно было смоделировать.
public interface IStaticMembershipService
{
MembershipUser GetUser();
void UpdateUser(MembershipUser user);
}
public class StaticMembershipService : IStaticMembershipService
{
public System.Web.Security.MembershipUser GetUser()
{
return Membership.GetUser();
}
public void UpdateUser(MembershipUser user)
{
Membership.UpdateUser(user);
}
}