0

私は嘲笑に慣れていません。メソッド GetById が Id を持つオブジェクト User を返すかどうかをテストしたいと思います。コードの下で、GetById(10) が ID = 10 のユーザーを返すかどうかをテストしたいと思います。

私はmoqを設定しました(正しいことを願っています)が、moqをどのように実行しますか?

ありがとう、

[TestMethod]
public void MyMoq()
{
    var userMock = new Mock<IUsers>();
    userMock.Setup(x => x.GetById(10)).Returns(new User());

    //After ?
    new Users().GetById(10);
}

public interface IUsers
{
    IUser GetById();
}

public IUser GetById(int id)
{
    using (var context = ....)
    {
        //code here

        //return user here
    }
}
4

4 に答える 4

0

コメントで言ったように、どのコードをテストしようとしているのかわかりません。ここには 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) - スタブ、モックなどを見るのに役立つかもしれません。

于 2013-04-03T09:47:56.820 に答える
0

何をテストしたいのかよくわかりません。また、説明していないメソッドを含む Mock クラスもあります。

ただし、嘲笑についての質問に答えます。このクラスを考えてみましょう:

public class MyMoq : IUsers
{
  private readonly Mock<IUsers> userMock;
  public MyMoq(Mock<IUsers> userMock){
    this.userMock = userMock;
  }

  [TestMethod]
  public IUser GetById()
  {
      userMock.Setup(x => x.GetById(10)).Returns(new User());

      //After ?
      return new UsersDb().GetById(10);
  }
}

使用するには:

MyMoq moq = new MyMoq(new Mock<IUsers>());
User u = moq.GetById();

この例での私の仮定Mock<IUsers>は、リポジトリでMyMoqあり、サービス クラスです。また、IUserエンティティ インターフェイスでありIUsers、サービス インターフェイスです。

于 2013-04-03T09:20:58.920 に答える
0

それがテストされている場合、GetById は独自のクラス (おそらく Users と呼ばれる) にある必要があります。その後、ユーザーはコンストラクターでコンテキストを受け入れることができます。次に、このコンテキストをモックして、スタブ化されたデータを返します。

要約すると

IUsers を実装するクラス Users ユーザーには、パラメーター IContext (またはここで呼び出されるもの) を持つコンストラクターがあります。テスト クラスは IContext をモックしますが、IUsers はモックしません。users.GetById を呼び出して、出力が正しいことを確認します。

コンテキストを設定する方法は、コンテキストのタイプによって異なりますが、https://cuttingedge.it/blogs/steven/pivot/entry.php?id=84を参照してください。

于 2013-04-03T09:36:52.317 に答える