注意:现在单元测试更容易设置.本教程与Xcode版本5及更高版本无关.
我花了很长时间,但我终于设法使它适用于我的项目.为了创建"逻辑"测试,我遵循Apple关于创建逻辑测试的指导原则.一旦您了解在构建期间运行逻辑测试,这就可以正常工作.
为了能够调试这些测试,需要创建一个可以调用这些测试的自定义可执行文件.本文通过对所著的Grokking可可博客肖恩·米塞利提供的所有信息来做到这一点.然而,它并没有立即取得成功,需要进行一些调整.
我将介绍Sean教程中提供的主要步骤,提供一些"for dummies"大纲,这花了我一些时间来弄清楚:
使用XCode 3.2.5执行以下操作
在XCode 4中,可以直接调试单元测试.只需编写测试,将其作为测试之一添加到目标并在其中设置断点.就这样.会有更多.
两者的名字可以是任何东西,但我会避免空格.

这里最重要的一点是获得正确的otest,即适用于您当前的iOS而不是默认的Mac版本.这在Sean的教程中有详细描述.以下是一些帮助我做好准备的细节:

讽刺的论点很容易设置......但事实证明这是我最大的问题.我最初将我的逻辑测试目标命名为"LogicTests Debug".使用此名称和"LogicTests Debug.octest"(带引号)作为otest的参数我保持otest终止与退出代码1并且永远不会停止到我的代码...
解决方案:目标名称中没有空格!
otest的论据是:
以下是复制/粘贴的环境变量列表:
请注意,我也尝试过DYLD_FORCE_FLAT_NAMESPACE,但这只是造成了骚乱.

本文介绍了一种有趣的OOP方法:
如果对象作为封装存在,并通过消息进行通信怎么办?如果代码重用与继承无关,但使用组合,委托,甚至老式帮助对象或程序员认为合适的任何技术,该怎么办?本体不会消失,但它与实现分离.
没有继承或依赖于类层次结构的重用的想法是我发现最令人震惊的,但这有多可行?
给出了示例,但我不太清楚如何更改当前代码以适应此方法.
那么这种方法有多可行?或者是否真的不需要更改代码,而是基于场景的方法,即"仅在需要或最佳时使用"?
编辑:哎呀,我忘了链接:这里是链接
我有一个控制器,它接收一个特定的接口实例.
界面看起来像这样:
public interface IMyInterface
{
... implementation goes here
}
Run Code Online (Sandbox Code Playgroud)
然后我有一些实现这个接口的类,如下所示:
public class MyClassA : IMyInterface
{
... implementation goes here
}
public class MyClassB : IMyInterface
{
... implementation goes here
}
Run Code Online (Sandbox Code Playgroud)
在我的ControllerA中,我有以下构造函数:
private ICustomerService customerService;
private IMyInterface myInterface;
puvlic ControllerA(ICustomerService customerService, IMyInterface myInterface)
{
this.customerService = customerService;
this.myInterface = myInterface;
}
Run Code Online (Sandbox Code Playgroud)
在我的global.ascx中:
protected void Application_Start()
{
// Autofac
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<NewsService>().As<INewsService>();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
Run Code Online (Sandbox Code Playgroud)
我指定Autofac必须提供ICustomerService的实例.我如何指定IMyInterface的实例类型?在这种情况下,对于ControllerA,我希望Autofac注入一个ClassA实例.对于ControllerB,我希望它能够注入ClassB.我该怎么做?
更新2011-02-14:
让我告诉你我现实生活中的情况.我有一个NewsController,其构造函数如下所示:
public NewsController(INewsService …Run Code Online (Sandbox Code Playgroud) c# dependency-injection inversion-of-control autofac automapper
我必须将一个对象的实例传递给一个函数,因此显然所有要作为参数的信息都将加载到评估堆栈中 这是我正在寻找的代码
someClass SomeObject = new someClass();
il.Emit(OpCodes.LoadObject, SomeObject);
il.Emit(OpCodes.CallVirt, MethodInfo Function);
public void Function(Object obj)
{
Type type = typeof(obj);
//do something w.r.t to the type
}
Run Code Online (Sandbox Code Playgroud)
我不需要任何存储在类中的信息只是类型,我不能使用任何原始类型来做出决定
最后我读到我可以使用一些操作码使用指针来加载类型......但我在这里完全迷失了,任何帮助或指向正确方向的指针都会很棒:)
[更新]
好吧,我找到了我自己问题的答案,尝试了它,它的工作原理不知道它是否正确,但我可以成功地创建一个对象并将其加载到堆栈中并将其传递给一个函数
ConstructorInfo ci = typeof(SomeClass).GetConstructor(System.Type.EmptyTypes);
IL.Emit(OpCodes.Newobj, ci);
IL.Emit(OpCodes.Call, SomeFunctionMethodInfo);
Run Code Online (Sandbox Code Playgroud)
SomeFunctionMethodInfo 是一个以 Object 作为参数的函数,我成功地将对象传递给函数,并且也可以操作它并将类作为对象返回。
我在任何地方都找不到对这个例子的引用,只是通过 MSDN 弄清楚了,我做错了什么还是有什么缺点?请专家们纠正或提供更好的答案
我的想法是避免在我的Asp.Net MVC应用程序中使用魔术字符串键.为此,我想创建要在应用程序中共享的字符串常量键.
例如,我可以写TempData[MyClass.Message]或TempData[MyEnum.Message.ToString()]代替TempData["Message"].
public class MyClass
{
public const string Message = "Message";
}
Run Code Online (Sandbox Code Playgroud)
和
public enum MyEnum
{
Message,
Others
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:哪种方法可以避免使用魔法字符串键?在类中使用字符串const键或与枚举一起使用ToString()?
我试图遍历我的xml文档的节点,以获取<username>Ed</username>每个节点的值.我使用Linq首先对XDocument进行排序,然后尝试循环遍历节点.我似乎无法找到正确的foreach循环来实现这一目标.任何帮助表示赞赏.
var doc = XDocument.Load("files\\config.xml");
var newDoc = new XDocument(new XElement("Config",
from p in doc.Element("Config").Elements("Profile")
orderby int.Parse(p.Element("order").Value)
select p));
foreach (XElement xe in newDoc.Nodes())
{
MessageBox.Show(xe.Element("username").Value);
}
// XML document
<Config>
<Profile>
<id>Scope</id>
<username>Scope 1</username>
<password>...</password>
<cdkey>0000</cdkey>
<expkey></expkey>
<cdkeyowner>Scope</cdkeyowner>
<client>W2BN</client>
<server>[IP]</server>
<homechannel>Lobby</homechannel>
<load>1</load>
<order>2</order>
</Profile>
<Profile>
<id>Scope 2</id>
<username>Scope 2</username>
<password>...</password>
<cdkey>0000</cdkey>
<expkey></expkey>
<cdkeyowner>Scope</cdkeyowner>
<client>W2BN</client>
<server>[IP]</server>
<homechannel>Lobby</homechannel>
<load>1</load>
<order>1</order>
</Profile>
</Config>
Run Code Online (Sandbox Code Playgroud) 使用Unity编程时需要使用哪种语言?或者它是许多语言的API?
我仔细阅读了文档,我想我错过了使用语言的观点.
它说它有iOS部署,这仍然允许程序员在目标C中编码吗?
Unity是一个可以用于许多平台的sdk,它是如何工作的?它提到在多个平台上部署相同的代码.
我在sdcard中加载了一个本地html,在这个html中我使用了标签:
<video id="myvideo" controls width="120" height="60" poster="img/img01.jpg" src="video/01.mp4"></video>
Run Code Online (Sandbox Code Playgroud)
然后我发现我没有加载这个html,当我禁用标签:,html工作正常,我在我的android avd(2.2)测试了这个?
我有一个很大的视图,需要很长时间才能完成呈现内容.如何分析最佳方法,视图的哪一部分花费最多时间?我已经阅读了关于ruby-prof的内容,但我不确定,在哪里放入它来分析视图渲染.如果存在其他选项,我也想知道它们.
我正在尝试连接到我的查询包含一些数据的Web服务.坏的是这个数据包含utf-8字符,这会产生问题.
如果我只是用普通字符串调用HttpGet,我会得到"非法字符"异常.所以我用Google搜索并尝试了一些utf-8魔法.
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter("http.protocol.content-charset", "UTF-8");
String utfurl = URLEncoder.encode(url, "utf-8");
HttpGet httpGet = new HttpGet(utfurl);
HttpResponse response = httpclient.execute(httpGet);
content = response.getEntity().getContent();
} catch (Exception e) {
Log.d(TAG, "getInputStream: " +e.getMessage());
Run Code Online (Sandbox Code Playgroud)
现在我不会得到非法的字符,但它似乎完全搞乱了utfurl,因为我反而得到"目标主机不能为空,或设置参数".可能是因为他不认识混乱的字符串中的"http://"部分.有什么建议?
问候
c# ×4
.net ×2
android ×2
asp.net-mvc ×1
autofac ×1
automapper ×1
composition ×1
dynamic-code ×1
html5 ×1
http-get ×1
httpclient ×1
ilgenerator ×1
inheritance ×1
ios ×1
iphone ×1
javascript ×1
linq ×1
ocunit ×1
oop ×1
performance ×1
profiling ×1
sorting ×1
unit-testing ×1
utf-8 ×1
views ×1
xcode ×1
xml ×1