2

私はユニットテストの初心者です。私を助けてください

私はクラスUserDataUserData.csを持っています

public partial class UserData
{

    /// <summary>
    /// return all not locked users
    /// </summary>
    /// <returns></returns>
    public static List<UserData> GetAllNotLockedUsers()
    {
        using (var db = new VostokPortalEntities())
        {
            var result = db.UserData.Where(i => !i.IsLocked).ToList();
            return result;
        }
        throw new Exception("cannot get users");
    }
}

コントローラーアクションがあります

    [HttpGet]
    public ActionResult Index()
    {           
        //get all user list
        var users = UserData.GetAllNotLockedUsers();
        return View(users);
    }

テストする方法があります

[TestMethod]
public void UserPageUnAuth()
{
    var fakedHttpContext = TestCore.FakeHttpContext();
    var homeController = new HomeController(fakedHttpContext);
    var indexResult = homeController.Index() as ViewResult;
    Assert.IsNotNull(indexResult);
}

Mockを使用してこれをテストしたいと思います。私は何をすべきか?リポジトリパターンでクラスを書き直す必要がありますか?これは必要ですか?コントローラロジックを書き直す必要がありますか?EF自動生成クラスにコードを追加する必要があります初心者向けのユニットテストに関する記事がインターネットにありますか?EFのモックを行う簡単な方法はありますか?

4

1 に答える 1

1

DB操作をリポジトリクラスに移動することをお勧めします。リポジトリのインターフェースを作成することから始める必要があります。

public interface IUserRepository
{
    IEnumerable<User> GetAllNotLockedUsers();
}

次に、非静的リポジトリクラスを実装する必要があります。

public class UserRepository : IUserRepository
{
    public IEnumerable<User> GetAllNotLockedUsers()
    {
        using (var db = new VostokPortalEntities())
        {
            var result = db.UserData.Where(i => !i.IsLocked).ToList();
            return result;
        }
    }
}

リポジトリは静的ではなくなったため、使用する前にどこかでインスタンス化する必要があります。ただし、以下のコードはテストできません。

[HttpGet]
public ActionResult Index()
{           
    var repository = new UserRepository();
    return View(repository.GetAllNotLockedUsers());
}

リポジトリは関数内に作成されるため、テスト用のモックに置き換えることはできません。このオブジェクトは、コンストラクターインジェクションを使用してインジェクトでき​​ます。

public class MyController : Controller
{
    private readonly IUserRepository _repository;

    public MyController(IUserRepository repository)
    {
        _repository = repository;
    }
}

具体的な実装の代わりにモックインスタンスを挿入できるため、MyControllerはテスト可能になりました。

[Test]
public void RepositoryTest()
{
    //using Moq here
    Mock<IUserRepository> repositoryMock = new Mock<IUserRepository>();
    MyController controller = new MyController(repositoryMock.Object);
}

ただし、デフォルトのコントローラーファクトリでは、パラメーターなしのコンストラクターがないとコントローラーを作成できません。リポジトリの実装については何も知りません。この時点から、コントローラーを作成するためのDIコンテナーの助けを借りる必要があります。これについては詳しく説明しません。このブログ投稿をご覧ください。

于 2012-07-19T13:48:47.413 に答える