0

私は単体テストの作成の初心者であり、機能させようとしているテストがあります。何をテストしようとしているのかを説明することから始めます。

Mvc 4 プロジェクトにメッセージを保存するメソッドをテストしようとしています。メソッドが呼び出されSaveMessage、以下に示されます。

namespace ChatProj.Service_Layer
{
    public class UserService : IUserService
    {
        public MessageContext messageContext = new MessageContext();

        public UserService()
        {
            _messageRepository = new MessageRepository(messageContext);
        }

        private  IMessageRepository _messageRepository;

    ->  public void SaveMessage(Message message)
        {
             messageContext.Messages.Add(message);
            _messageRepository.Save();
        }

_messageRepository.Saveメソッド内は私のSaveMessageDAL レイヤーに実装されてMessageRepositoryおり、次のようになります。

public void Save()
        {
            context.SaveChanges();
        }

この保存方法は少し複雑に思えるかもしれませんが、データ アクセス層 ( & )で処理できる & べき (だと思う) 操作をサービス層 ( IUserService& ) に処理させたくなかったので、この方法でプロジェクトを構成しました。 .UserServiceIMessageRepositoryMessageRepository

ここで、トリッキーな部分が来ます。これを単体テストする方法を理解しようとしています。これは私の試みです:

namespace ChatProj.Tests
{
    [TestFixture]
    class MessageRepositoryTests
    {
        [SetUp]
        public void Setup()
        {

        }

        [Test]
    public void SaveMessage_SaveWorking_VerifyUse()
    {
        //Arrange
        var userServiceMock = new Mock<UserService>();
        var message = new Message { MessageID = 0, Name = "Erland", MessageString = "Nunit Test", MessageDate = DateTime.Now };
        var repositoryMock = new Mock<IMessageRepository>();
        var contextMock = new Mock<MessageContext>();
        MessageRepository messageRepository = new MessageRepository(contextMock.Object);
        UserService userService = new UserService();

        //Act
        userService.SaveMessage(message);

        //Assert
        repositoryMock.Verify(m => m.Save());
        userServiceMock.Verify(m => m.SaveMessage(message));
    }
}

Imgur linkというエラーが表示されますが、解決方法がよくわかりません。他のいくつかの SO 投稿を見てみましたが、テストがうまくいきません。

ユニットテストを実際に機能させるにはどうすればよいですか?

4

2 に答える 2

1

次の 2 行を見てください。

UserService userService = new UserService();

//Act
userService.SaveMessage(message);

インスタンスを作成し、userServiceすぐにメッセージを保存しています。コードにジャンプしSaveMessageます。

public void SaveMessage(Message message)
{
     messageContext.Messages.Add(message);
    _messageRepository.Save();
}

では、 に何かを追加してからmessageContextを呼び出し_messageRepository.Save()ます。しかし、messageContextインスタンス_messageRepository化されているのはどこですか?

public MessageContext messageContext = new MessageContext();

public UserService()
{
    _messageRepository = new MessageRepository(messageContext);
}

インスタンス化時にそれらを作成しています。テストで作成したモックは使用されていません。UserServiceコンストラクターでこれらのオブジェクトのインスタンスを作成する代わりに、それらを引数としてコンストラクターに渡すことを検討してください。次に、モック化されたインスタンスをテストに渡すことができます。

于 2013-11-12T14:33:58.633 に答える