我正在尝试对 Xamarin.iOS 项目中的一些代码进行单元测试,但出现无法解决的编译器错误。有人对如何解决错误有建议吗?
在单个解决方案中,我有一个用于我的应用程序的非 UI 部分的 Xamarin.iOS 项目和另一个 Xamarin.iOS 单元测试项目。我正在测试 Parse 作为后端,但想从我的大多数应用程序中隐藏它,所以我添加了一个扩展方法,它将我的 User 模型转换为 ParseUser 对象。当我尝试在我的单元测试项目中使用扩展方法时,我收到以下错误:
/Matchup/MatchupXplatformTests/ParseHelperTests.cs(27,27):错误 CS1061:类型
MatchupXplatform.Models.User' does not contain a definition for
ToParseUser' 并且找不到扩展方法ToParseUser' of type
MatchupXplatform.Models.User'。您是否缺少程序集参考?(CS1061) (MatchupXplatformTests)
这是我要运行的代码:
[Test]
public void Pass ()
{
var user = new User () {
Username = "me@you.com",
Email = "me@you.com",
Password = "meyoucom",
Name = "Me You"
};
ParseUser pUser = user.ToParseUser (); // <- Error here
Assert.Equals (user.Username, pUser.Username);
}
令人困惑的部分是,在上面的代码片段中,Xamarin Studio 中的代码完成解析了 .ToParseUser() 扩展方法,提供了有关该方法的准确信息,并且可以找到该方法的声明,但编译器仍然会生成错误。
我确保单元测试项目引用了另一个项目,单元测试文件具有用户模型和扩展方法类的 using 语句。我还验证了下面的代码在后端项目中有效,但在单元测试项目中无效。
Xamarin Studio:版本 4.1.3(内部版本 66) Xamarin.iOS:版本:6.3.6.76(试用版)
更新:根据要求,附加代码:
MatchupXplatform/Models/User.cs:
using System;
using System.Runtime.Serialization;
namespace MatchupXplatform.Models
{
public class User
{
[DataMember(Name = "username")]
public string Username { get; set; }
[DataMember(Name = "email")]
public string Email { get; set; }
[DataMember(Name = "password")]
public string Password { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
}
MatchupXplatform/ParseHelper.cs:
using System;
using System.Runtime.Serialization;
using System.Reflection;
using System.Collections.Generic;
using Parse;
using MatchupXplatform.Models;
namespace MatchupXplatform
{
internal static class ParseHelper
{
public static ParseUser ToParseUser (this User user)
{
var pUser = new ParseUser ();
try {
var pObj = (ParseObject)pUser;
user.UpdateParseObject (ref pObj);
return pUser;
} catch (ParseException pe) {
Console.WriteLine (pe);
return null;
}
}
public static User ToUser (this ParseUser pUser)
{
return pUser.ToParseObject<User> ();
}
}
...
}
MatchupXplatformTests 参考:Parse.iOS.dll MatchupXplatform monotouch MonoTouch.NUnitLite System System.Core System.Xml
MatchupXplatformTests/ParseHelperTests.cs:
using System;
using NUnit.Framework;
using MatchupXplatform;
using MatchupXplatform.Models;
using Parse;
namespace MatchupXplatformTests
{
[TestFixture]
public class ParseHelperTests
{
[TestFixtureSetUp]
public void Setup ()
{
ParseStarter.Initialize ();
}
[Test]
public void Pass ()
{
var user = new User () {
Username = "me@you.com",
Email = "me@you.com",
Password = "meyoucom",
Name = "Me You"
};
ParseUser pUser = user.ToParseUser (); // <- Error here
Assert.Equals (user.Username, pUser.Username);
}
}
}
在为此苦苦挣扎了几个小时之后,我最终只是将此功能封装在一个服务方法中,然后从单元测试中调用该方法。这很好,但我很好奇为什么会产生错误。