私のリポジトリを定義するデータアセンブリがあります。Moq、TDDおよび複数のレイヤー
私は自分のサービスを定義するサービスアセンブリを持っており、各サービスはNinjectによってコンストラクタに注入されたリポジトリを持っています。
私はユニット私のサービスメソッドをテストしていた場合、すべてが正常である:(別のレベルダウン)私のコントローラをテストするとき
[TestClass]
public class UserTests
{
IQueryable<User> users;
int userID;
public UserTests()
{
users = new List<User>()
{
new User { EmailAddress = "[email protected]", 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("[email protected]", "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("[email protected]", "password", out userID);
//
Assert.IsFalse(loggedIn);
}
}
しかし、私は問題に実行していますよ。
私のコントローラはサービスに依存しており、サービスはリポジトリによって異なります。私は私のコントローラテストを動作させるように見えません。ここでは、私がこれまで持っているものです。
[TestClass]
public class AccountTests
{
IQueryable<User> users;
public AccountTests()
{
users = new List<User>()
{
new User { CompanyId = 1, EmailAddress = "[email protected]", Password = "password"},
new User { CompanyId = 1, EmailAddress = "[email protected]", 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 = "[email protected]", Password = "password" }) as RedirectToRouteResult;
// Assert
service.Verify(x => x.UserLogin("[email protected]", "password", out userID), Times.Once());
Assert.AreEqual("Index", result.RouteValues["Action"]);
}
}
私は(私はそれにUserRepositoryのインスタンスを渡ししようとするんだけど、それが動作していない)UserServiceのをインスタンス化に関するエラーを取得しておきます。
私は何か愚かなことをする必要がありますが、何ですか?
私はmoq/ninjectについてはわかりませんが、私はあなたのサービスを嘲笑しているので、これは決してリポジトリを必要としません。あなたの実際の実装は可能性があります。あなたはちょうど1つ下のレベルをテストする必要があります。あなたはあなたのSUTを持っていて、SUTがアクセスしようとしているオブジェクトだけをモックする必要があります。 –
@Paul私はあなたのアプリに使用するコンポジションルートを見ることに興味があります。 –