0

リポジトリインターフェイスを実装するMockRepositoryを作成する方法を見つけようとしています。現在、これは私が持っているものです:

public class MockUserRepository
    {
        private readonly IList<User> _users;

        public MockUserRepository()
        {
            _users = new List<User>()
                         {
                             new User()
                                 {
                                     UserId = new Guid("E480E40F-6802-4296-B2A8-E0D5E018CD41"),
                                     Username = "admin",
                                     Password = "5A105E8B9D40E1329780D62EA2265D8A",
                                     CellPhone = "3175172957"
                                 }
                         };
        }

        public IUserRepository Create()
        {
            var mockUserRepository = new Mock<IUserRepository>();

            mockUserRepository.Setup(m => m.Count()).Returns(_users.Count());

            mockUserRepository.Setup(m => m.Get()).Returns(_users);

            mockUserRepository.Setup(m => m.Get(It.IsAny<Guid>())).Returns((Guid id) => _users.First(x => x.UserId == id));

            mockUserRepository.Setup(m => m.Save(It.IsAny<User>())).Returns(
                (User user) =>
                    {
                        var now = DateTime.Now;

                        user.ModifiedOn = now;

                        if(user.UserId.Equals(Guid.Empty))
                        {
                            user.CreatedOn = now;
                            _users.Add(user);
                        } 
                        else
                        {
                            var original = _users.First(x => x.UserId == user.UserId);
                            if (original == null)
                            {
                                return false;
                            }

                            original = user;
                        }
                        return true;
                    }
                );

            mockUserRepository.Setup(m => m.Find(It.IsAny<IList<object[]>>())).Returns(
                (IList<object[]> criteria) =>
                {
                    IList<User> uList = _users.ToList();

                    foreach (object[] criteriaItem in criteria)
                    {
                        var name = (string)criteriaItem[0];
                        var value = (string)criteriaItem[1];
                        IList<User> tempList = uList.ToList();
                        IList<User> addList = tempList.Where(user => (string) user.GetType().GetProperty(name).GetValue(user, null) == value).ToList();
                        uList = addList;
                    }
                    return uList;
                });

            return mockUserRepository.Object;
        }
    }

私はこのようなものが欲しいです:

public class MockUserRepository : IUserRepository

次に、モックされたすべてのメソッドを実際に実装します。これを実行して、開発者がインターフェイスに基づいてリポジトリを完全にモックアウトするように強制したいと思います。

テスト側から見ると、このモックリポジトリは次のように使用されます。

[SetUp]
    public void Setup()
    {
        MockUserRepository = new MockUserRepository().Create();
        MockRoleRepository = new MockRoleRepository().Create();
        MockQuestionRepository = new MockQuestionRepository().Create();

        AuthenticationService = new AuthenticationService(MockUserRepository, MockRoleRepository, MockQuestionRepository);
    }

これはすべて問題なく機能しますが、MockRepositoryにそのインターフェイスのすべてのメソッドを実装するように強制することに固執しています。

4

1 に答える 1

2

これは、モックの使用を複雑にしすぎています。テストでIUserRepositoryインターフェイスをモックし、テストに基づいて必要なメソッドをモックするだけです。

reposistory = new Mock<IUserRepository>();

var id = 1;
var user = new User();
repository.Setup(x=> x.Get(id)).Returns(user);

var sut = new Service(repository.Object);
var result = sut.Get(id);

Assert.Equals(user, result);

本当に「空白」のオブジェクトが必要な場合は、偽のIUserRepositoryを実装し、モックフレームワークを完全に使用しないでください。

class FakeUserRepository : IUserRepository
{
    public List<User> Users = new List<Users>();

    public User Get(long id)
    {
         return Users.FristOrDetail(x=>x.Id = id);
    }
}

var id = 1;
var user = new User();
var repository = new FakeUserRepository();
repository.Users.Add(user);

var sut = new Service(repository);
var result = sut.Get(id);

Assert.Equals(user, result);    
于 2012-09-20T19:13:45.573 に答える