C# UnitTest将项目添加到列表并检查是否存在

C# UnitTest将项目添加到列表并检查是否存在,c#,visual-studio,unit-testing,moq,C#,Visual Studio,Unit Testing,Moq,我想测试我的代码是否正常工作,所以我正在为它编写一些单元测试 我想检查当我的列表中具有相同值的项被再次添加时,它应该返回false 我真的不明白如何设置这个。我希望有人能帮助我。 在我的代码下面 招待所 using System; using System.Collections.Generic; using System.Linq; using System.Web; using PartyInvites.Abstract; namespace PartyInvites.Models {

我想测试我的代码是否正常工作,所以我正在为它编写一些单元测试

我想检查当我的列表中具有相同值的项被再次添加时,它应该返回false

我真的不明白如何设置这个。我希望有人能帮助我。 在我的代码下面

招待所

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PartyInvites.Abstract;

namespace PartyInvites.Models
{
    public class GuestResponseRepository : IRepository

    {
        private static List<GuestResponse> responses = new List<GuestResponse>();

        IEnumerable<GuestResponse> IRepository.GetAllResponses()
        {
            return responses;
        }

        bool IRepository.AddResponse(GuestResponse response)
        {
            if (responses.Any(x => x.Email == response.Email)) //here
            {
                if (responses.Any(x => x.WillAttend == response.WillAttend)) //here
                {
                    return false;
                }

                var attend = responses.First(x => x.Email == response.Email && x.WillAttend != response.WillAttend);
                attend.WillAttend = response.WillAttend;
                return true;
            }

            responses.Add(response);
            return true;
        }
    }
}
我的家庭控制器的一部分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PartyInvites.Models;
using PartyInvites.Abstract;

namespace PartyInvites.Controllers {
    public class HomeController : Controller {
        private IRepository repository;

        public HomeController(IRepository iRepository)
        {
            this.repository = iRepository;
        }


        [HttpGet]
        public ViewResult RsvpForm() {
            return View();
        }

        [HttpPost]
        public ViewResult RsvpForm(GuestResponse guestResponse) {
            if (ModelState.IsValid) {

                bool result = repository.AddResponse(guestResponse);
                ViewBag.Response = result;

                repository.AddResponse(guestResponse);                
                return View("Thanks", guestResponse);
            }
            else
            {
                // there is a validation error
                return View();
            }
        }
    }
}
我的单元测试到目前为止我得到了什么

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PartyInvites.Abstract;
using PartyInvites.Controllers;
using PartyInvites.Models;
using Moq;

namespace Aanmelden
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void FirstResponse()
        {
            //Arange
            Mock<IRepository> mock = new Mock<IRepository>();
            mock.Setup(m => m.AddResponse()).Returns(new GuestResponse[] {
            new GuestResponse {Name = "Valheru", Email = "valheru@hotmail.com", Phone = "12345678", WillAttend = true}
            });

            HomeController controller = new HomeController(mock.Object);
            //Act
            new GuestResponse
            {
                Name = "Valheru",
                Email = "valheru@hotmail.com",
                Phone = "12345678",
                WillAttend = true
            };

            //Assert
            if viewbag.response = result == false test succeeded

        }
    }
}
使用系统;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用PartyInvites.摘要;
使用PartyVites.控制器;
使用PartyInvites.Models;
使用最小起订量;
名称空间Aanmelden
{
[测试类]
公共类UnitTest1
{
[测试方法]
公共响应()
{
//阿兰奇
Mock Mock=新Mock();
mock.Setup(m=>m.AddResponse()).Returns(new GuestResponse[]{
新访客响应{Name=“Valheru”,电子邮件=”valheru@hotmail.com,Phone=“12345678”,willattent=true}
});
HomeController=新的HomeController(mock.Object);
//表演
新访客响应
{
Name=“Valheru”,
电子邮件=”valheru@hotmail.com",
Phone=“12345678”,
将出席=真
};
//断言
如果viewbag.response=result==false测试成功
}
}
}
出于某种原因,
mock.Setup(m=>m.*AddResponse**()).Returns(newguestresponse[]{…
“AddResponse”不是说Visual Studio->

没有给出与所需的形式化参数相对应的参数 IRepository.AddResponse的参数“response”(GuestResponse)

我也不确定我的Act代码,我完全丢失了断言部分。我希望有人能帮助我!

你应该
it.IsAny()
作为参数,以匹配你接口的签名

    Mock<IRepository> mock = new Mock<IRepository>();
    mock.Setup(m => m.AddResponse(It.IsAny<GuestResponse>())).Returns(true);
Mock Mock=new Mock();
Setup(m=>m.AddResponse(It.IsAny())。返回(true);
您应该
It.IsAny()
作为参数,以匹配接口的签名

    Mock<IRepository> mock = new Mock<IRepository>();
    mock.Setup(m => m.AddResponse(It.IsAny<GuestResponse>())).Returns(true);
Mock Mock=new Mock();
Setup(m=>m.AddResponse(It.IsAny())。返回(true);
基于

我想检查是否添加了列表中具有相同值的项 同样,它应该返回false

实际上,您应该测试
GuestResponseRepository
实现本身,而不是控制器

[TestMethod]
public void Duplicate_Added_Should_Return_False {
    //Arrange
    var sut = new GuestResponseRepository();
    var model = new GuestResponse
    {
        Name = "Valheru",
        Email = "valheru@hotmail.com",
        Phone = "12345678",
        WillAttend = true
    };

    sut.AddResponse(model);

    var expected = false;

    //Act
    var actual = sut.AddResponse(model);

    //Assert
    Assert.AreEqual(expected, actual);
}
基于

我想检查是否添加了列表中具有相同值的项 同样,它应该返回false

实际上,您应该测试
GuestResponseRepository
实现本身,而不是控制器

[TestMethod]
public void Duplicate_Added_Should_Return_False {
    //Arrange
    var sut = new GuestResponseRepository();
    var model = new GuestResponse
    {
        Name = "Valheru",
        Email = "valheru@hotmail.com",
        Phone = "12345678",
        WillAttend = true
    };

    sut.AddResponse(model);

    var expected = false;

    //Act
    var actual = sut.AddResponse(model);

    //Assert
    Assert.AreEqual(expected, actual);
}

谢谢你的建议,但是如果我添加它。IsAny(GuestResponse)会返回:“GuestResponse”是一种类型,在给定的上下文中无效。谢谢你的建议,但是如果我添加它。IsAny(GuestResponse)它返回:“GuestResponse”是一种类型,在给定上下文中无效。为什么在控制器操作中将
GuestResponse
添加到存储库中两次?为什么在控制器操作中将
GuestResponse
添加到存储库中两次?感谢Nkosi的回复!我将代码更改为您建议的代码,但我t看起来像mock.Setup(m=>m.GetAllResponses()).Returns(responses);不好。它返回:无法从PartyInvites.Models.GuestResponse转换为System.Collections.Generic.IEnumerable。Act部分还需要一些额外的使用,但现在看起来很好:)关于回复有什么建议吗?我不应该使用IRepository进行测试吗?因为依赖项注入并不是毫无意义的(将来我会将GuestResponseRepository添加到数据库中)IRepository是一个抽象,用作对其他类的依赖关系。根据最初的问题,您希望测试存储库的逻辑。因此,需要测试的是实现。这听起来很合乎逻辑:)代码中唯一不起作用的是sut.AddResponse。它说GuestResponseRepository不包含在类to
bool AddResponse(GuestResponse response)中,为AddResponse更改
bool-ireposition.AddResponse(GuestResponse)定义
。或者在调用方法之前显式地将sut强制转换为
IRepository
。感谢Nkosi为您回复!我将代码更改为您建议的代码,但它看起来像mock.Setup中的响应(m=>m.GetAllResponses())。返回(响应);不好。它返回:无法从PartyInvites.Models.GuestResponse转换为System.Collections.Generic.IEnumerable。此外,Act部分需要一些额外的使用,但现在看起来很好:)对响应有什么建议吗?我不应该使用iResponse进行测试吗?因为没有免费使用依赖注入(将来我将GuestResponseRepository存储到数据库)IRepository是一个抽象,用作对其他类的依赖关系。根据最初的问题,您希望测试存储库的逻辑。因此,需要测试的是实现。这听起来很合逻辑:)代码中唯一不起作用的是sut.AddResponse。它表示GuestResponseRepository不包含AddResponseChange
bool iResponse.AddResponse(GuestResponse response)
类to
bool AddResponse(GuestResponse response)的定义
。或在调用方法之前显式地将sut强制转换为
IRepository