我仍然是C#和单元测试的初学者,但有一个我不知道如何解决的问题。 我有一个Mongo数据库,我只想模拟这个数据库。 在解释问题之前,我将先向您展示我的代码。
这是我的单元测试课:
private FollowManager _followManager;
private FollowsDao _followSubstitute;
private UsersDao _userSubstitute;
private IMongoDatabase _database;
private IMongoCollection<Follow> _followMongoCollection;
private IMongoCollection<User> _userMongoCollection;
[OneTimeSetUp]
public void OneTimeSetup()
{
_database = Substitute.For<IMongoDatabase>();
_followMongoCollection = Substitute.For<IMongoCollection<Follow>>();
_userMongoCollection = Substitute.For<IMongoCollection<User>>();
_followSubstitute = new FollowsDao(_database, _followMongoCollection);
_userSubstitute = new UsersDao(_database, _userMongoCollection);
_followManager = new FollowManager(_followSubstitute, _userSubstitute);
}
[TestCase(1, 2)]
[TestCase(3, 4)]
public void AssertThatBuildFollowReturnsValidFollow(int followerId, int followedId)
{
UserFollow userFollow = new UserFollow {Follower = followerId, Followed = followedId};
Follow follow = _followManager.BuildFollow(userFollow);
Assert.IsNotNull(follow);
}
这是我要在FollowManager
中测试的功能:
public Follow BuildFollow(UserFollow follow)
{
User follower = _userDao.FindUserByNumber(follow.Follower).Result;
User followed = _userDao.FindUserByNumber(follow.Followed).Result;
Follow newFollow = new Follow { Follower = follower, Followed = followed, Date = DateTime.Now };
InsertOrUpdateFollow(newFollow);
return newFollow;
}
FindUserByNumber
方法将在数据库中搜索与作为参数传递的ID匹配的用户:
public async Task<User> FindUserByNumber(int number)
{
List<User> result = await _collection.Find(user => user.Number == number && user.Active).ToListAsync();
return result.FirstOrDefault();
}
我的问题是:
当我在单元测试中调用Follow follow = _followManager.BuildFollow(userFollow);
时,经理中的这一行InsertOrUpdateFollow(newFollow);
会引发错误。正常是因为属性Follower
和Followed
为空,因为我的数据库是模拟的。
我有一个包含数据库用户列表的JSON文件,我希望能够从该文件而不是从数据库中恢复我的用户。
有了这个,我的用户进入了我的JSON文件:
List<User> users = JsonConvert.DeserializeObject<List<User>>(File.ReadAllText(@"C:\users-list-api-result.json"));
所以,我的问题是: 如何使用JSON模拟文件测试此功能?
谢谢!