在IMongoCollection替代上模拟数据

时间:2019-05-27 19:49:20

标签: c# mongodb nsubstitute

我仍然是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);会引发错误。正常是因为属性FollowerFollowed为空,因为我的数据库是模拟的。

我有一个包含数据库用户列表的JSON文件,我希望能够从该文件而不是从数据库中恢复我的用户。

有了这个,我的用户进入了我的JSON文件:

List<User> users = JsonConvert.DeserializeObject<List<User>>(File.ReadAllText(@"C:\users-list-api-result.json"));

所以,我的问题是: 如何使用JSON模拟文件测试此功能?

谢谢!

0 个答案:

没有答案