gpt4 book ai didi

c# - 从列表中返回单个对象

转载 作者:行者123 更新时间:2023-11-30 17:39:09 24 4
gpt4 key购买 nike

在设置我的存储库时,我试图返回一个帐户对象。它应该从用户名等于参数的列表中返回此对象。

但是我得到了异常

Object of type 'System.String' cannot be converted to type 'IncrediStaff.DataAccess.Models.Account'.

    [TestInitialize]
public void Setup()
{
var repository = new Mock<IAccountRepository>();
var accounts = new List<Account>
{
new Account { AccountId = 1, Username = "John", Hash = "9f3Iv0NW9Jr3l+EmOS/zWCPe96k=", Salt = "y7qwIY0ep8aHiiSwl57dt4ueuCo=" }, // Password is, "TestPassword"
new Account { AccountId = 2, Username = "Ryan", Hash = "63mnR/gbFIIU6vGEFqoY5H1QCCI=", Salt = "xi/lkLFqPPTR5Q9rX3m/PJ4FH0rECyalYdyRJ6pCpfE=" }, // Password is, "NewPassword"
new Account { AccountId = 3, Username = "Sarah", Hash = null, Salt = null, FirstLogin = 1 }
};

repository.Setup(x => x.GetAccount(It.IsAny<string>()))
.Returns<Account>(r => accounts.FirstOrDefault(x => x.Username == It.IsAny<string>()));

_service = new AccountService(repository.Object);
}

[TestMethod]
[TestCategory("Accounts")]
public void UserPasswordIsCorrect()
{
Assert.IsTrue(_service.Login("John", "TestPassword"));
}

如果我返回单个 Account 对象,则测试通过。

        repository.Setup(x => x.GetAccount(It.IsAny<string>()))
.Returns(new Account
{
AccountId = 1,
Username = "John",
Hash = "9f3Iv0NW9Jr3l+EmOS/zWCPe96k=",
Salt = "y7qwIY0ep8aHiiSwl57dt4ueuCo="
});

我不确定为什么它不能从列表中返回单个对象。此外,我还有另一个使用相同列表且测试通过的设置。我不确定为什么这个行得通而另一个行不通。

        repository.Setup(r => r.SelectIfUsernameExists(It.IsAny<string>()))
.Returns<string>(username => accounts.Exists(r => r.Username == username));

最佳答案

您应该检查此案例的来源以了解您的问题: https://github.com/moq/moq4/blob/b2cf2d303ea6644fda2eaf10bad43c88c05b395f/Source/Language/IReturns.cs https://github.com/moq/moq4/blob/b2cf2d303ea6644fda2eaf10bad43c88c05b395f/Source/MethodCallReturn.cs

具体来说,这个:

IReturnsResult<TMock> Returns<T>(Func<T, TResult> valueFunction);

文档说,T 是:

The type of the argument of the invoked method

所以 Returns 的泛型参数中 T 的类型实际上是第一个参数的类型,它被传递到您在之前的设置方法中模拟的函数中。

您的设置确实 x.GetAccount(It.IsAny<string>()) - 它模拟具有签名的方法 Account GetAccount(string name) ,因此调用的方法接受一个类型为 string 的参数.所以当你做 Returns ,您的 IDE 已经知道返回参数的类型 - 它是 TResult就像在文档中一样。如果您不指定泛型参数,它将始终返回您在 .Returns() 中定义的对象。 .但是,如果您想根据您的 .Setup() 对其进行参数化,您需要明确说明在您正在模拟的函数中以什么顺序传递了哪些参数。在您的情况下,只有 1 个类型为 string 的参数您传递的是用户名。所以要进行参数绑定(bind),你必须传递它的类型 - string - 作为通用参数。

这样做也是为了让您可以为您的 .Returns 提供多个参数方法,例如: .Returns<string, int, DateTime>((string str, int i, DateTime date) => ...);

关于c# - 从列表中返回单个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35793341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com