1

リポジトリを定義するデータ アセンブリがあります。

次に、サービスを定義するサービス アセンブリを用意します。各サービスには、Ninject によってコンストラクターに注入されたリポジトリがあります。

サービス メソッドの単体テストを行っているときは、すべて問題ありません。

[TestClass]
public class UserTests
{
    IQueryable<User> users;
    int userID;

    public UserTests()
    {
        users = new List<User>()
        {
            new User { EmailAddress = "known@user.com", Password = "password", ID = 1}
        }.AsQueryable();
    }

    [TestMethod]
    public void Known_User_Can_Login()
    {
        // Arrange
        var repository = new Mock<IUserRepository>();
        var service = new UserService(repository.Object);

        repository.Setup(r => r.GetAll())
           .Returns(users);

        // Act
        bool loggedIn = service.UserLogin("known@user.com", "password", out userID);

        // Assert
        Assert.IsTrue(loggedIn);
        Assert.AreEqual(1, userID);
    }

    [TestMethod]
    public void Unknown_User_Cannot_Login()
    {
        // Arrange
        var repository = new Mock<IUserRepository>();
        var service = new UserService(repository.Object);

        repository.Setup(r => r.GetAll())
            .Returns(users);

        // Act
        bool loggedIn = service.UserLogin("unknown@user.com", "password", out userID);

        //
        Assert.IsFalse(loggedIn);
    }
}

ただし、コントローラーをテストするときに問題が発生しています (別のレベルダウン)。

私のコントローラーはサービスに依存しており、サービスはリポジトリに依存しています。コントローラーのテストが機能しないようです。これが私がこれまでに持っているものです:

 [TestClass]
public class AccountTests
{
    IQueryable<User> users;

    public AccountTests()
    {
        users = new List<User>()
        {
            new User { CompanyId = 1, EmailAddress =  "known@user.com", Password = "password"},
            new User { CompanyId = 1, EmailAddress = "unknown@user.com", Password = "password"}
        }.AsQueryable();
    }

    [TestMethod]
    public void Known_User_Can_Login()
    {
        int userID = 0;

        var repo = new Mock<IUserRepository>();

        // Arrange
        var service = new Mock<UserService>(repo.Object);
        var controller = new AccountController(service.Object);

        // Act
        var result = controller.Login(new LoginModel { EmailAddress = "known@user.com", Password = "password" }) as RedirectToRouteResult;

        // Assert
        service.Verify(x => x.UserLogin("known@user.com", "password", out userID), Times.Once());
        Assert.AreEqual("Index", result.RouteValues["Action"]);
    }
}

UserService のインスタンス化に関するエラーが発生し続けます (UserRepository のインスタンスをそれに渡そうとしていますが、機能していません)。

私は何かばかげたことをしているに違いありませんが、何ですか?

4

2 に答える 2

2

UserServiceがインターフェースであることを確認してください。

また、ここで行っているように、2番目のテストでIUserRepositoryのインスタンスを作成しないでください。

var repo = new Mock<IUserRepository>();
// Arrange
var service = new Mock<UserService>(repo.Object);

UserServiceはモックされているため、とにかくIUserRepositoryを呼び出すことはなく、モックを作成するときに依存関係を指定する必要はありません。

あなたがする必要があるのは、この方法でUserServiceのモックを作成することです。

var service = new Mock<UserService>();

通常、タフなUserServiceはリポジトリに依存していますが、Moqはメソッドへの既定の応答を提供するだけなので、実際のリポジトリを呼び出す必要はありません。

于 2012-05-14T12:50:41.960 に答える
1

UserService私が推測しているクラスは、インターフェイスでも抽象クラスでもありません。そうでない場合、モックはUserService. したがって、UserService のインターフェイスを作成するか、抽象クラスとして定義するか、次のようにインスタンス化します。

var service = new UserService(repo.Object);

または、使用することもできますが、 APIMock.Create<UserService>()を使用して UserService が必要とするすべての実装を提供する必要があります。Mock.Provide<T>()

お役に立てれば。

これが問題でない場合は、UserService とリポジトリのクラスで質問を更新してください

于 2012-05-14T09:57:03.833 に答える