我通过添加一个新属性来扩展ApplicationUser类(如教程中所示, 使用Facebook和Google OAuth2和OpenID登录创建一个ASP.NET MVC 5应用程序(C#))
public class ApplicationUser : IdentityUser
{
public DateTime BirthDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个单元测试来验证我的AccountController是否正确保存了BirthDate.
我创建了一个名为TestUserStore的内存用户存储
[TestMethod]
public void Register()
{
// Arrange
var userManager = new UserManager<ApplicationUser>(new TestUserStore<ApplicationUser>());
var controller = new AccountController(userManager);
// This will setup a fake HttpContext using Moq
controller.SetFakeControllerContext();
// Act
var result =
controller.Register(new RegisterViewModel
{
BirthDate = TestBirthDate,
UserName = TestUser,
Password = TestUserPassword,
ConfirmPassword = TestUserPassword
}).Result;
// Assert
Assert.IsNotNull(result);
var addedUser = userManager.FindByName(TestUser);
Assert.IsNotNull(addedUser);
Assert.AreEqual(TestBirthDate, …Run Code Online (Sandbox Code Playgroud) 我正在创建一个类库,可以在许多情况下使用ASP.NET,控制台应用程序,其他类库和XAML目标,如Silverlight或WPF.
最初我决定将集合公开为IList.但是当使用XAML编写样本时,我发现如果我想让它很容易绑定到这些集合,我需要使用ObservableCollection.
我有什么选择?
我可以让库暴露ObservableCollection并强制对与XAML无关的用户.那是一件坏事?
我可以使我的类通用,允许调用者指定他们想要的集合类型,只要它实现ICollection,也许默认为Collection
我可以创建一组使用ObservableCollection的类和一个不说Foo和ObservableFoo的类.
我可以在我的类中实现INotifyCollectionChanged但是当ObservableCollection为我做这件事时,这似乎很愚蠢.
显然我正在努力保持代码干净简单,但支持数据绑定似乎很重要.
有什么建议?
编辑:尝试使用两种替代方法创建可移植类库项目.
在Foo课我有
private readonly Collection<string> strings = new Collection<string>();
public ReadOnlyCollection<string> Strings
{
get
{
return new ReadOnlyCollection<string>(this.strings);
}
}
Run Code Online (Sandbox Code Playgroud)
在班级ObservableFoo我有
private readonly ObservableCollection<string> strings = new ObservableCollection<string>();
public ReadOnlyObservableCollection<string> Strings
{
get
{
return new ReadOnlyObservableCollection<string>(this.strings);
}
}
Run Code Online (Sandbox Code Playgroud)
非常简单的单元测试代码是
[TestMethod]
public void TestMethod1()
{
var foo = new ObservableFoo(); // or new Foo()
Assert.AreNotEqual(0, foo.Id);
Assert.AreNotEqual(0, foo.Strings.Count);
}
Run Code Online (Sandbox Code Playgroud)
唯一的缺点是,当我使用ReadOnlyObservableCollection时,测试项目得到了这个编译错误
类型'System.Collections.ObjectModel.ReadOnlyObservableCollection`1'在未引用的程序集中定义.您必须添加对程序集'System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e,Retargetable = Yes'的引用
因此,在这种情况下,使用ReadOnlyObservableCollection将强制用户添加对System.Windows的引用,这是一个缺点.
编辑:我想出了一个我在博客上发布的解决方案 …