コメントで言ったように、どのコードをテストしようとしているのかわかりません。ここには 2 つの選択肢があります。1)Users
クラスはIUsers
インターフェースを実装しており、あなたの意図はGetById(int)
メソッドの実装をテストすることです。このような場合、「Users#GetById(id)」メソッドをモックする必要はありません。呼び出して結果を確認するだけで済みます。コードは次のようになります。
interface IUser
{
int Id { get; }
}
class User : IUser
{
public int Id { get;set; }
}
interface IUsers
{
IUser GetById(int id);
}
class Users : IUser
{
public IUser GetById(int id)
{
// TODO: make call db call
// TODO: parse the result
// TODO: and return new User instance with all the data from db
return new User{ Id = id };
}
}
[TestMethod]
public void MyMoq()
{
// TODO: prepare/mock database. That's whole another story.
var users = new Users();
// act
var user = users.GetById(10);
// assert
Assert.AreEqual(10, user.Id);
}
2)Users#GetById(int)
メソッドは を呼び出してIUsers#GetById(int)
結果を返すことになっています。そのような場合、IUsers
(問題で示したように) のモックを作成し、それを に渡す必要がありUsers
ます。コードは次のようになります(重複の可能性があります):
interface IUser
{
int Id { get; }
}
class User : IUser
{
public int Id { get;set; }
}
interface IUsers
{
IUser GetById(int id);
}
class Users : IUser
{
private readonly IUser _users;
public Users(IUser users)
{
_users = users;
}
public IUser GetById(int id)
{
// next line of code is to be tested in unit test
return _users.GetById(id);
}
}
[TestMethod]
public void MyMoq()
{
var usersMock = new Mock<IUsers>();
usersMock.Setup(x => x.GetById(10)).Returns(new User());
var users = new Users(usersMock.Object);
// act
var user = users.GetById(10);
// assert
Assert.AreEqual(10, user.Id);
}
ps moq チュートリアルとThe Art of Unit Testing book Part 2 - Core techniques
(page 47) - スタブ、モックなどを見るのに役立つかもしれません。